You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
2.4 KiB

4 years ago
package console
import (
"context"
"fmt"
"os"
"strings"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/argument"
"gitoa.ru/go-4devs/console/input/flag"
4 years ago
"gitoa.ru/go-4devs/console/input/option"
4 years ago
"gitoa.ru/go-4devs/console/input/validator"
"gitoa.ru/go-4devs/console/input/value"
4 years ago
"gitoa.ru/go-4devs/console/output"
4 years ago
"gitoa.ru/go-4devs/console/output/descriptor"
4 years ago
)
//nolint:gochecknoinits
4 years ago
func init() {
MustRegister(help())
}
const (
ArgumentCommandName = "command_name"
OptionFormat = "format"
4 years ago
)
func help() *Command {
return &Command{
Name: CommandHelp,
Description: `Displays help for a command`,
Help: `
The <info>{{ .Name }}</info> command displays help for a given command:
<info>{{ .Bin }} {{ .Name }} list</info>
You can also output the help in other formats by using the <comment>--format</comment> option:
<info>{{ .Bin }} {{ .Name }} --format=xml list</info>
To display the list of available commands, please use the <info>list</info> command.
`,
Execute: func(ctx context.Context, in input.Input, out output.Output) error {
var err error
name := in.Argument(ctx, ArgumentCommandName).String()
format := in.Option(ctx, OptionFormat).String()
4 years ago
des, err := descriptor.Find(format)
if err != nil {
return fmt.Errorf("find descriptor: %w", err)
4 years ago
}
cmd, err := Find(name)
if err != nil {
return fmt.Errorf("find cmd: %w", err)
4 years ago
}
def := input.NewDefinition()
if err := cmd.Init(ctx, Default(def)); err != nil {
return fmt.Errorf("init cmd: %w", err)
4 years ago
}
var bin string
if len(os.Args) > 0 {
bin = os.Args[0]
}
derr := des.Command(ctx, out, descriptor.Command{
4 years ago
Bin: bin,
Name: cmd.Name,
Description: cmd.Description,
Help: cmd.Help,
Definition: def,
})
if derr != nil {
return fmt.Errorf("descriptor help:%w", derr)
}
return nil
4 years ago
},
Configure: func(ctx context.Context, config *input.Definition) error {
formats := descriptor.Descriptors()
config.
SetArguments(
argument.String(ArgumentCommandName, "The command name", argument.Default(value.New("help"))),
4 years ago
).
SetOptions(
option.String(OptionFormat, fmt.Sprintf("The output format (%s)", strings.Join(formats, ", ")),
4 years ago
option.Required,
option.Default(formats[0]),
option.Valid(
4 years ago
validator.NotBlank(flag.String),
4 years ago
validator.Enum(formats...),
),
),
)
return nil
},
}
}