Skip to content

Commit 13048bc

Browse files
authored
Merge pull request #27 from knbr13/optimize-build-options-func
use strings.Builder instead of string concatenation + use type switch instead of reflection
2 parents 7f958c5 + 745eb83 commit 13048bc

File tree

1 file changed

+59
-85
lines changed

1 file changed

+59
-85
lines changed

shared/options.go

Lines changed: 59 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -28,109 +28,86 @@ type Options struct {
2828
}
2929

3030
func (o *Options) BuildOptionBanner() string {
31-
var banner string
32-
banner += color.RedString("┌")
33-
banner += color.RedString("[")
34-
banner += color.MagentaString((*o).URL)
35-
banner += color.RedString("]\n")
31+
var sb strings.Builder
32+
33+
sb.WriteString(color.RedString("┌["))
34+
sb.WriteString(color.MagentaString((*o).URL))
35+
sb.WriteString(color.RedString("]\n"))
36+
3637
t := reflect.TypeOf(*o)
38+
v := reflect.ValueOf(*o)
3739
for i := 0; i < t.NumField(); i++ {
38-
3940
field := t.Field(i)
4041
name := field.Tag.Get("name")
4142
if name == "url" {
4243
continue
4344
}
44-
value := reflect.ValueOf(*o).Field(i).Interface()
45+
46+
value := v.Field(i).Interface()
4547
if value == nil || value == "" || value == false {
46-
banner += color.RedString("│")
47-
banner += color.BlueString(name + ": ")
48-
banner += color.CyanString("not set")
49-
banner += "\n"
48+
sb.WriteString(color.RedString("│"))
49+
sb.WriteString(color.BlueString(name + ": "))
50+
sb.WriteString(color.CyanString("not set\n"))
5051
continue
5152
}
53+
sb.WriteString(color.RedString("│"))
54+
sb.WriteString(color.BlueString(name + ": "))
5255

53-
typeof := reflect.TypeOf(value)
54-
if typeof.Kind() == reflect.Slice {
55-
s := reflect.ValueOf(value)
56-
if s.Len() == 0 {
57-
banner += color.RedString("│")
58-
banner += color.BlueString(name + ": ")
59-
banner += color.CyanString("not set")
60-
banner += "\n"
61-
continue
56+
switch value := value.(type) {
57+
case []string:
58+
if len(value) == 0 {
59+
sb.WriteString(color.CyanString("not set"))
60+
} else {
61+
sb.WriteString(color.CyanString("\n"))
62+
for _, s := range value {
63+
sb.WriteString(color.RedString("│"))
64+
sb.WriteString(color.CyanString(" %s", s))
65+
sb.WriteString("\n")
66+
}
6267
}
63-
banner += color.RedString("│")
64-
banner += color.BlueString(name + ": ")
65-
66-
// check the type of the slice
67-
typeOfIndex := s.Index(0).Kind()
68-
if typeOfIndex == reflect.Int {
69-
for i := 0; i < s.Len(); i++ {
70-
if i == s.Len()-1 {
71-
banner += color.CyanString(" %d", s.Index(i).Interface().(int))
72-
continue
68+
case []int:
69+
if len(value) == 0 {
70+
sb.WriteString(color.CyanString("not set"))
71+
} else {
72+
for i, v := range value {
73+
if i == 0 {
74+
sb.WriteString(color.CyanString("%d", v))
75+
} else {
76+
sb.WriteString(color.CyanString(", %d", v))
7377
}
74-
75-
banner += color.CyanString(" %d", s.Index(i).Interface().(int))
76-
banner += color.CyanString(",")
77-
}
78-
} else if typeOfIndex == reflect.String {
79-
for i := 0; i < s.Len(); i++ {
80-
banner += color.CyanString("\n")
81-
banner += color.RedString("│")
82-
banner += color.CyanString(" %s", s.Index(i).Interface().(string))
8378
}
8479
}
85-
banner += "\n"
86-
87-
} else if typeof.Kind() == reflect.String {
88-
89-
banner += color.RedString("│")
90-
banner += color.BlueString(name + ": ")
91-
banner += color.CyanString("%s", value.(string))
92-
banner += "\n"
93-
} else if typeof.Kind() == reflect.Int {
94-
banner += color.RedString("│")
95-
banner += color.BlueString(name + ": ")
96-
banner += color.CyanString("%d", value.(int))
97-
banner += "\n"
98-
} else if typeof.Kind() == reflect.Bool {
99-
banner += color.RedString("│")
100-
banner += color.BlueString(name + ": ")
101-
banner += color.CyanString("%t", value.(bool))
102-
banner += "\n"
103-
} else if typeof.Kind() == reflect.Map {
104-
if len(value.(map[string]string)) == 0 {
105-
banner += color.RedString("│")
106-
banner += color.BlueString(name + ": ")
107-
banner += color.CyanString("not set")
108-
banner += "\n"
109-
continue
110-
}
111-
banner += color.RedString("│")
112-
banner += color.BlueString(name + ": ")
113-
banner += color.CyanString("\n")
114-
for k, v := range value.(map[string]string) {
115-
banner += color.RedString("│")
116-
banner += color.CyanString(" %s: %s", k, v)
117-
banner += "\n"
80+
case map[string]string:
81+
if len(value) == 0 {
82+
sb.WriteString(color.CyanString("not set"))
83+
} else {
84+
sb.WriteString(color.CyanString("\n"))
85+
for k, v := range value {
86+
sb.WriteString(color.RedString("│"))
87+
sb.WriteString(color.CyanString(" %s: %s", k, v))
88+
sb.WriteString("\n")
89+
}
11890
}
119-
} else {
120-
121-
banner += color.RedString("│")
122-
banner += color.BlueString(name + ": ")
91+
case string:
92+
sb.WriteString(color.CyanString("%s", value))
93+
case int:
94+
sb.WriteString(color.CyanString("%d", value))
95+
case bool:
96+
sb.WriteString(color.CyanString("%t", value))
97+
default:
12398
if fmt.Sprintf("%v", value) == "<nil>" {
124-
banner += color.CyanString("not set")
99+
sb.WriteString(color.CyanString("not set"))
125100
} else {
126-
banner += color.CyanString("%v", value)
101+
sb.WriteString(color.CyanString("%v", value))
127102
}
128-
banner += "\n"
129103
}
130104

105+
sb.WriteString("\n")
131106
}
132-
banner += color.RedString("└")
133-
return banner
107+
108+
sb.WriteString(color.RedString("└"))
109+
110+
return sb.String()
134111
}
135112

136113
func (o *Options) PrintBanner() {
@@ -172,10 +149,7 @@ func ValidateThenBuildOption(cmd *cobra.Command) (*Options, error) {
172149
return nil, err
173150
}
174151
// regexMap, err := cmd.Flags().GetStringToString("regexes")
175-
regexMap, err := cmd.Flags().Lookup("regexes").Value.(*RegexFlag).Value(), nil
176-
if err != nil {
177-
return nil, err
178-
}
152+
regexMap := cmd.Flags().Lookup("regexes").Value.(*RegexFlag).Value()
179153

180154
excludedStatus, err := cmd.Flags().GetIntSlice("exclude-code")
181155
if err != nil {

0 commit comments

Comments
 (0)