feat: Embed() option and Context.Call()
The former allows arbitrary structs to be embedded in the root of the CLI, with optional tags. The latter allows an arbitrary function to be called using Kong's binding functionality.
This commit is contained in:
@@ -68,6 +68,7 @@ type Kong struct {
|
||||
|
||||
// Set temporarily by Options. These are applied after build().
|
||||
postBuildOptions []Option
|
||||
embedded []embedded
|
||||
dynamicCommands []*dynamicCommand
|
||||
}
|
||||
|
||||
@@ -110,6 +111,25 @@ func New(grammar interface{}, options ...Option) (*Kong, error) {
|
||||
k.Model = model
|
||||
k.Model.HelpFlag = k.helpFlag
|
||||
|
||||
// Embed any embedded structs.
|
||||
for _, embed := range k.embedded {
|
||||
tag, err := parseTagString(strings.Join(embed.tags, " ")) //nolint:govet
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tag.Embed = true
|
||||
v := reflect.Indirect(reflect.ValueOf(embed.strct))
|
||||
node, err := buildNode(k, v, CommandNode, tag, map[string]bool{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, child := range node.Children {
|
||||
child.Parent = k.Model.Node
|
||||
k.Model.Children = append(k.Model.Children, child)
|
||||
}
|
||||
k.Model.Flags = append(k.Model.Flags, node.Flags...)
|
||||
}
|
||||
|
||||
// Synthesise command nodes.
|
||||
for _, dcmd := range k.dynamicCommands {
|
||||
tag, terr := parseTagString(strings.Join(dcmd.tags, " "))
|
||||
@@ -188,6 +208,10 @@ func (k *Kong) interpolateValue(value *Value, vars Vars) (err error) {
|
||||
vars = vars.CloneWith(varsContributor.Vars(value))
|
||||
}
|
||||
|
||||
if value.Enum, err = interpolate(value.Enum, vars, nil); err != nil {
|
||||
return fmt.Errorf("enum for %s: %s", value.Summary(), err)
|
||||
}
|
||||
|
||||
updatedVars := map[string]string{
|
||||
"default": value.Default,
|
||||
"enum": value.Enum,
|
||||
|
||||
Reference in New Issue
Block a user