From 47f227841eb6496be98005608b2942f44510085d Mon Sep 17 00:00:00 2001 From: jremy Date: Tue, 26 Mar 2024 15:46:52 +0100 Subject: [PATCH] feat(core):handle display oneof --- internal/core/cobra_builder.go | 2 +- internal/core/cobra_usage_builder.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/internal/core/cobra_builder.go b/internal/core/cobra_builder.go index 19b0a082a6..edea2f0899 100644 --- a/internal/core/cobra_builder.go +++ b/internal/core/cobra_builder.go @@ -120,7 +120,7 @@ func (b *cobraBuilder) hydrateCobra(cobraCmd *cobra.Command, cmd *Command, group if len(cmd.Aliases) > 0 { cobraCmd.Annotations["Aliases"] = buildUsageAliases(b.ctx, cmd) } - + if cmd.ArgsType != nil { cobraCmd.Annotations["UsageArgs"] = BuildUsageArgs(b.ctx, cmd, false) } diff --git a/internal/core/cobra_usage_builder.go b/internal/core/cobra_usage_builder.go index f0b60e33b7..183862b520 100644 --- a/internal/core/cobra_usage_builder.go +++ b/internal/core/cobra_usage_builder.go @@ -65,9 +65,28 @@ func BuildUsageArgs(ctx context.Context, cmd *Command, deprecated bool) string { // _buildUsageArgs builds the arg usage list. // This should not be called directly. func _buildUsageArgs(ctx context.Context, w io.Writer, argSpecs ArgSpecs) error { + inOneOfGroup := false + lastOneOfGroup := "" + for _, argSpec := range argSpecs { + argSpecUsageLeftPart := argSpec.Name argSpecUsageRightPart := _buildArgShort(argSpec) + + if argSpec.OneOfGroup != "" { + if argSpec.OneOfGroup != lastOneOfGroup { + inOneOfGroup = true + lastOneOfGroup = argSpec.OneOfGroup + _, err := fmt.Fprintf(w, " %s (one of):\n", argSpec.OneOfGroup) + if err != nil { + return err + } + } + } else { + inOneOfGroup = false + lastOneOfGroup = "" + } + if argSpec.Default != nil { _, doc := argSpec.Default(ctx) argSpecUsageLeftPart = fmt.Sprintf("%s=%s", argSpecUsageLeftPart, doc) @@ -78,6 +97,9 @@ func _buildUsageArgs(ctx context.Context, w io.Writer, argSpecs ArgSpecs) error if argSpec.CanLoadFile { argSpecUsageRightPart += " (Support file loading with @/path/to/file)" } + if inOneOfGroup { + argSpecUsageLeftPart = " " + argSpecUsageLeftPart + } _, err := fmt.Fprintf(w, " %s\t%s\n", argSpecUsageLeftPart, argSpecUsageRightPart) if err != nil {