You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: action-set.go
    path of file: ./repos/juju/worker/uniter/runner/jujuc
    
    the code of the file until where you have to start completion: // Copyright 2014 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.

package jujuc

import (
	"fmt"
	"strings"

	"github.com/juju/charm/v12"
	"github.com/juju/cmd/v3"
	"github.com/juju/gnuflag"

	jujucmd "github.com/juju/juju/cmd"
)

var keyRule = charm.GetActionNameRule()

// list of action result keys that are not allowed to be set by users
var reservedKeys = []string{"stdout", "stdout-encoding", "stderr", "stderr-encoding"}

// ActionSetCommand implements the action-set command.
type ActionSetCommand struct {
	cmd.CommandBase
	ctx  Context
	args [][]string
}

// NewActionSetCommand returns a new ActionSetCommand with the given context.
func NewActionSetCommand(ctx Context) (cmd.Command, error) {
	return &
    
func (c *ActionSetCommand) Info() *cmd.Info {
	reservedText := `"` + strings.Join(reservedKeys, `", "`) + `"`
	doc := fmt.Sprintf(`
action-set adds the given values to the results map of the Action. This map
is returned to the user after the completion of the Action. Keys must start
and end with lowercase alphanumeric, and contain only lowercase alphanumeric,
hyphens and periods.  The following special keys are reserved for internal use: 
%s.

Example usage:
 action-set outfile.size=10G
 action-set foo.bar=2
 action-set foo.baz.val=3
 action-set foo.bar.zab=4
 action-set foo.baz=1

 will yield:

 outfile:
   size: "10G"
 foo:
   bar:
     zab: "4"
   baz: "1"
`, reservedText)
	return jujucmd.Info(&cmd.Info{
		Name:    "action-set",
		Args:    "<key>=<value> [<key>=<value> ...]",
		Purpose: "set action results",
		Doc:     doc,
	})
}