@@ -3,8 +3,10 @@ package cmd
33import (
44 "fmt"
55 "strings"
6+ "sort"
67
78 "github.com/spf13/cobra"
9+ "github.com/lets-cli/lets/set"
810)
911
1012// newRootCmd represents the base command when called without any subcommands.
@@ -58,6 +60,94 @@ func PrintHelpMessage(cmd *cobra.Command) error {
5860 return err
5961}
6062
63+ func buildGroupCommandHelp (cmd * cobra.Command , group * cobra.Group ) string {
64+ help := ""
65+ cmds := []* cobra.Command {}
66+
67+ // select commands that belong to the specified group
68+ for _ , c := range cmd .Commands () {
69+ if c .GroupID == group .ID && (c .IsAvailableCommand () || c .Name () == "help" ) {
70+ cmds = append (cmds , c )
71+ }
72+ }
73+
74+ sort .Slice (cmds , func (i , j int ) bool {
75+ return cmds [i ].Name () < cmds [j ].Name ()
76+ })
77+
78+ // Create a list of subgroups
79+ subGroupNameSet := set .NewSet [string ]()
80+
81+ for _ , c := range cmds {
82+ if subgroup , ok := c .Annotations ["SubGroupName" ]; ok && subgroup != "" {
83+ subGroupNameSet .Add (subgroup )
84+ }
85+ }
86+
87+ subGroupNameList := subGroupNameSet .ToList ()
88+ sort .Strings (subGroupNameList )
89+
90+ // generate output
91+ help += fmt .Sprintf ("%s\n " , group .Title )
92+
93+ for _ , subgroupName := range subGroupNameList {
94+ intend := ""
95+ if len (subGroupNameList ) > 1 {
96+ help += fmt .Sprintf ("\n %s\n " , subgroupName )
97+ intend = " "
98+ }
99+ for _ , c := range cmds {
100+ if subgroup , ok := c .Annotations ["SubGroupName" ]; ok && subgroup == subgroupName {
101+ help += fmt .Sprintf ("%s %-*s %s\n " , intend , cmd .NamePadding (), c .Name (), c .Short )
102+ }
103+ }
104+ }
105+
106+ for _ , c := range cmds {
107+ if _ , ok := c .Annotations ["SubGroupName" ]; ! ok {
108+ help += fmt .Sprintf (" %-*s %s\n " , cmd .NamePadding (), c .Name (), c .Short )
109+ }
110+ }
111+
112+ help += "\n "
113+
114+ return help
115+ }
116+
117+
118+ func PrintRootHelpMessage (cmd * cobra.Command ) error {
119+ help := ""
120+ help = fmt .Sprintf ("%s\n \n %s" , cmd .Short , help )
121+
122+ // General
123+ help += "Usage:\n "
124+ if cmd .Runnable () {
125+ help += fmt .Sprintf (" %s\n " , cmd .UseLine ())
126+ }
127+ if cmd .HasAvailableSubCommands () {
128+ help += fmt .Sprintf (" %s [command]\n " , cmd .CommandPath ())
129+ }
130+ help += "\n "
131+
132+ // Commands
133+ for _ , group := range cmd .Groups () {
134+ help += buildGroupCommandHelp (cmd , group )
135+ }
136+
137+ // Flags
138+ if cmd .HasAvailableLocalFlags () {
139+ help += "Flags:\n "
140+ help += cmd .LocalFlags ().FlagUsagesWrapped (120 )
141+ help += "\n "
142+ }
143+
144+ // Usage
145+ help += fmt .Sprintf (`Use "%s help [command]" for more information about a command.` , cmd .CommandPath ())
146+
147+ _ , err := fmt .Fprint (cmd .OutOrStdout (), help )
148+ return err
149+ }
150+
61151func PrintVersionMessage (cmd * cobra.Command ) error {
62152 _ , err := fmt .Fprintf (cmd .OutOrStdout (), "lets version %s\n " , cmd .Version )
63153 return err
0 commit comments