Skip to content

Commit 477ca4e

Browse files
committed
update the help display format
1 parent 36bf894 commit 477ca4e

File tree

2 files changed

+115
-25
lines changed

2 files changed

+115
-25
lines changed

command-help-cmd.go

Lines changed: 113 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package clicmdflags
22

33
import (
44
"fmt"
5+
"strconv"
56
"strings"
67
)
78

@@ -25,24 +26,34 @@ func (thisRef *Command) showUsage() {
2526
cmd = cmd.parentCommand
2627
}
2728

29+
var constHorizontalLine = string('\u2500')
30+
var constHalfCrossDownLine = string('\u252C')
31+
var constCrossLine = string('\u253C')
32+
var constVerticalLine = string('\u2502')
33+
var constHalfCrossRightLine = string('\u251C')
34+
var constHalfCrossUpLine = string('\u2534')
35+
2836
fmt.Println()
29-
fmt.Println("~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
37+
fmt.Println(strings.Repeat(constHorizontalLine, 94))
3038
fmt.Println(fmt.Sprintf(" %s", thisRef.Description))
3139

32-
fmt.Println("~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
33-
fmt.Println(fmt.Sprintf(" Usage | %s", strings.TrimSpace(usageString)))
40+
fmt.Println(strings.Repeat(constHorizontalLine, 10) + constHalfCrossDownLine + strings.Repeat(constHorizontalLine, 83))
41+
fmt.Println(fmt.Sprintf(" Usage %s %s", constVerticalLine, strings.TrimSpace(usageString)))
42+
fmt.Println(fmt.Sprintf(" ") + constVerticalLine)
3443

3544
if len(definedFlags) > 0 {
36-
fmt.Println("~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
37-
fmt.Print(fmt.Sprintf(" Flags |"))
38-
for i, definedFlag := range definedFlags {
45+
fmt.Println(strings.Repeat(constHorizontalLine, 10) + constCrossLine + strings.Repeat(constHorizontalLine, 83))
46+
fmt.Print(fmt.Sprintf(" Flags " + constVerticalLine))
47+
48+
pDefinedFlags := paddedFlags(definedFlags)
49+
for i, definedFlag := range pDefinedFlags {
3950
if i == 0 {
40-
fmt.Println(fmt.Sprintf(" %s, type=%s, required=%s, default=%s, %s", flagPatterns[0]+definedFlag.name, definedFlag.typeName, definedFlag.isRequired, definedFlag.defaultValue, definedFlag.description))
51+
fmt.Println(fmt.Sprintf(" %s, type=%s, required=%s, default=%s, %s", definedFlag.name, definedFlag.typeName, definedFlag.isRequired, definedFlag.defaultValue, definedFlag.description))
4152
} else {
42-
fmt.Println(fmt.Sprintf(" | %s, type=%s, required=%s, default=%s, %s", flagPatterns[0]+definedFlag.name, definedFlag.typeName, definedFlag.isRequired, definedFlag.defaultValue, definedFlag.description))
53+
fmt.Println(fmt.Sprintf(" %s %s, type=%s, required=%s, default=%s, %s", constVerticalLine, definedFlag.name, definedFlag.typeName, definedFlag.isRequired, definedFlag.defaultValue, definedFlag.description))
4354
}
4455
}
45-
fmt.Println(fmt.Sprintf(" |"))
56+
fmt.Println(fmt.Sprintf(" ") + constVerticalLine)
4657
}
4758

4859
if !areTheseGlobalFlags {
@@ -54,47 +65,124 @@ func (thisRef *Command) showUsage() {
5465
rootCmd = rootCmd.parentCommand
5566
}
5667

57-
definedFlags = rootCmd.getDefinedFlags()
68+
pDefinedFlags := paddedFlags(rootCmd.getDefinedFlags())
5869

5970
if len(definedFlags) > 0 {
60-
fmt.Println(" | ~~~~ global flags ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
61-
for _, definedFlag := range definedFlags {
62-
fmt.Println(fmt.Sprintf(" | %s, type=%s, required=%s, default=%s, %s", flagPatterns[0]+definedFlag.name, definedFlag.typeName, definedFlag.isRequired, definedFlag.defaultValue, definedFlag.description))
71+
fmt.Println(" " + constHalfCrossRightLine + strings.Repeat(constHorizontalLine, 10) + " global flags " + strings.Repeat(constHorizontalLine, 59))
72+
for _, definedFlag := range pDefinedFlags {
73+
fmt.Println(fmt.Sprintf(" %s %s, type=%s, required=%s, default=%s, %s", constVerticalLine, definedFlag.name, definedFlag.typeName, definedFlag.isRequired, definedFlag.defaultValue, definedFlag.description))
6374
}
64-
fmt.Println(fmt.Sprintf(" |"))
75+
fmt.Println(fmt.Sprintf(" ") + constVerticalLine)
6576
}
6677
}
6778

6879
if len(thisRef.Examples) > 0 {
69-
fmt.Println("~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
70-
fmt.Print(fmt.Sprintf(" Examples |"))
80+
fmt.Println(strings.Repeat(constHorizontalLine, 10) + constCrossLine + strings.Repeat(constHorizontalLine, 83))
81+
fmt.Print(fmt.Sprintf(" Examples " + constVerticalLine))
7182
for i, example := range thisRef.Examples {
7283
if i == 0 {
7384
fmt.Println(fmt.Sprintf(" %s", example))
7485
} else {
75-
fmt.Println(fmt.Sprintf(" | %s", example))
86+
fmt.Println(fmt.Sprintf(" %s %s", constVerticalLine, example))
7687
}
7788
}
78-
fmt.Println(fmt.Sprintf(" |"))
89+
fmt.Println(fmt.Sprintf(" ") + constVerticalLine)
7990
}
8091

8192
if len(thisRef.subCommands) > 1 {
82-
fmt.Println("~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
83-
fmt.Print(fmt.Sprintf(" Commands |"))
93+
fmt.Println(strings.Repeat(constHorizontalLine, 10) + constCrossLine + strings.Repeat(constHorizontalLine, 83))
94+
fmt.Print(fmt.Sprintf(" Commands " + constVerticalLine))
8495
firstOnePrinted := false
85-
for _, c := range thisRef.subCommands {
86-
if c != helpCmd {
96+
pSubCommands := paddedCommands(thisRef.subCommands)
97+
for _, c := range pSubCommands {
98+
if c.Name != helpCmd.Name {
8799
if !firstOnePrinted {
88100
fmt.Println(fmt.Sprintf(" %s, %s", c.Name, c.Description))
89101
firstOnePrinted = true
90102
} else {
91-
fmt.Println(fmt.Sprintf(" | %s, %s", c.Name, c.Description))
103+
fmt.Println(fmt.Sprintf(" %s %s, %s", constVerticalLine, c.Name, c.Description))
92104
}
93105
}
94106
}
95-
fmt.Println(fmt.Sprintf(" |"))
107+
fmt.Println(fmt.Sprintf(" ") + constVerticalLine)
96108
}
97109

98-
fmt.Println("~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~")
110+
fmt.Println(strings.Repeat(constHorizontalLine, 10) + constHalfCrossUpLine + strings.Repeat(constHorizontalLine, 83))
99111
fmt.Println()
100112
}
113+
114+
func paddedFlags(input []flag) []flag {
115+
definedFlagNameMaxLength := 0
116+
definedFlagTypeNameMaxLength := 0
117+
definedFlagIsRequiredMaxLength := 0
118+
definedFlagDefaultValueMaxLength := 0
119+
definedFlagDescriptionMaxLength := 0
120+
121+
for _, val := range input {
122+
if len(flagPatterns[0]+val.name) > definedFlagNameMaxLength {
123+
definedFlagNameMaxLength = len(flagPatterns[0] + val.name)
124+
}
125+
if len(val.typeName) > definedFlagTypeNameMaxLength {
126+
definedFlagTypeNameMaxLength = len(val.typeName)
127+
}
128+
if len(val.isRequired) > definedFlagIsRequiredMaxLength {
129+
definedFlagIsRequiredMaxLength = len(val.isRequired)
130+
}
131+
if len(val.defaultValue) > definedFlagDefaultValueMaxLength {
132+
definedFlagDefaultValueMaxLength = len(val.defaultValue)
133+
}
134+
if len(val.description) > definedFlagDescriptionMaxLength {
135+
definedFlagDescriptionMaxLength = len(val.description)
136+
}
137+
}
138+
139+
output := []flag{}
140+
for _, definedFlag := range input {
141+
definedFlagPaddedName := fmt.Sprintf("%"+strconv.Itoa(-definedFlagNameMaxLength)+"s", flagPatterns[0]+definedFlag.name)
142+
definedFlagPaddedTypeName := fmt.Sprintf("%"+strconv.Itoa(-definedFlagTypeNameMaxLength)+"s", definedFlag.typeName)
143+
definedFlagPaddedIsRequired := fmt.Sprintf("%"+strconv.Itoa(-definedFlagIsRequiredMaxLength)+"s", definedFlag.isRequired)
144+
definedFlagPaddedDefaultValue := fmt.Sprintf("%"+strconv.Itoa(-definedFlagDefaultValueMaxLength)+"s", definedFlag.defaultValue)
145+
definedFlagPaddedDescription := fmt.Sprintf("%"+strconv.Itoa(-definedFlagDescriptionMaxLength)+"s", definedFlag.description)
146+
147+
output = append(output, flag{
148+
name: definedFlagPaddedName,
149+
typeName: definedFlagPaddedTypeName,
150+
isRequired: definedFlagPaddedIsRequired,
151+
defaultValue: definedFlagPaddedDefaultValue,
152+
description: definedFlagPaddedDescription,
153+
})
154+
}
155+
156+
return output
157+
}
158+
159+
func paddedCommands(input []*Command) []Command {
160+
definedCommandNameMaxLength := 0
161+
definedCommandDescriptionMaxLength := 0
162+
163+
for _, val := range input {
164+
if val.Name != helpCmd.Name {
165+
if len(val.Name) > definedCommandNameMaxLength {
166+
definedCommandNameMaxLength = len(val.Name)
167+
}
168+
if len(val.Description) > definedCommandDescriptionMaxLength {
169+
definedCommandDescriptionMaxLength = len(val.Description)
170+
}
171+
}
172+
}
173+
174+
output := []Command{}
175+
for _, val := range input {
176+
if val.Name != helpCmd.Name {
177+
definedCommandPaddedName := fmt.Sprintf("%"+strconv.Itoa(-definedCommandNameMaxLength)+"s", val.Name)
178+
definedCommandPaddedDescription := fmt.Sprintf("%"+strconv.Itoa(-definedCommandDescriptionMaxLength)+"s", val.Description)
179+
180+
output = append(output, Command{
181+
Name: definedCommandPaddedName,
182+
Description: definedCommandPaddedDescription,
183+
})
184+
}
185+
}
186+
187+
return output
188+
}

samples/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package main
22

33
import (
44
"log"
5+
"os"
56

67
"github.com/codemodify/systemkit-clicmdflags/samples/cmdflags"
78
)
89

910
func main() {
11+
os.Args = append(os.Args, "help")
1012
if err := cmdflags.Execute(); err != nil {
1113
log.Fatal(err)
1214
}

0 commit comments

Comments
 (0)