Skip to content

Commit 588ef00

Browse files
committed
refactor: store option short name as byte instead of string
1 parent f4fcce9 commit 588ef00

File tree

3 files changed

+33
-29
lines changed

3 files changed

+33
-29
lines changed

builder.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ func (c *CommandInfo) prepareAndValidate() {
7676
for i := 0; i < len(c.Opts)-1; i++ {
7777
for z := i + 1; z < len(c.Opts); z++ {
7878
// assert there are no duplicate long or short option names
79-
if c.Opts[i].NameShort != "" && c.Opts[i].NameShort == c.Opts[z].NameShort {
79+
if c.Opts[i].NameShort != 0 && c.Opts[i].NameShort == c.Opts[z].NameShort {
8080
panic("command '" + strings.Join(c.Path, " ") +
81-
"' contains duplicate option short name '" + c.Opts[i].NameShort + "'")
81+
"' contains duplicate option short name '" + string(c.Opts[i].NameShort) + "'")
8282
}
8383
if c.Opts[i].NameLong != "" && c.Opts[i].NameLong == c.Opts[z].NameLong {
8484
panic("command '" + strings.Join(c.Path, " ") +
@@ -149,7 +149,7 @@ func (c CommandInfo) Usage(lines ...string) CommandInfo {
149149
// pattern starting with the [NewOpt] function or its siblings).
150150
func (c CommandInfo) Opt(o InputInfo) CommandInfo {
151151
// Assert `o` is not a positional arg by making sure it has at least one option name.
152-
if o.NameShort == "" && o.NameLong == "" {
152+
if o.NameShort == 0 && o.NameLong == "" {
153153
panic(errEmptyOptNames)
154154
}
155155
c.Opts = append(c.Opts, o)
@@ -254,7 +254,7 @@ func (in InputInfo) WithParser(vp ValueParser) InputInfo {
254254
// Short sets this option's short name to the given character. In order to create an
255255
// option that has a short name but no long name, see [InputInfo.ShortOnly].
256256
func (in InputInfo) Short(c byte) InputInfo {
257-
in.NameShort = string(c)
257+
in.NameShort = c
258258
return in
259259
}
260260

@@ -315,5 +315,5 @@ func (in InputInfo) WithHelpGen(hg HelpGenerator) InputInfo {
315315
}
316316

317317
func (in *InputInfo) isOption() bool {
318-
return in.NameShort != "" || in.NameLong != ""
318+
return in.NameShort != 0 || in.NameLong != ""
319319
}

cli.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ type CommandInfo struct {
108108

109109
type InputInfo struct {
110110
ID string
111-
NameShort string
111+
NameShort byte
112112
NameLong string
113113
HelpBlurb string
114114
EnvVar string
@@ -293,7 +293,7 @@ func (h HelpRequestError) Error() string {
293293
return h.HelpMsg
294294
}
295295

296-
func lookupOptionByShortName(in *CommandInfo, shortName string) *InputInfo {
296+
func lookupOptionByShortName(in *CommandInfo, shortName byte) *InputInfo {
297297
for i := range in.Opts {
298298
if in.Opts[i].NameShort == shortName {
299299
return &in.Opts[i]
@@ -392,7 +392,7 @@ func parse(c *CommandInfo, p *Command, args []string) error {
392392
// which would be handled by the rest of the option parsing code in this loop.
393393
if arg[0] != '-' && len(arg) > 1 && arg[1] != '=' {
394394
for charIdx := range arg {
395-
optName := string(arg[charIdx])
395+
optName := arg[charIdx]
396396
optInfo := lookupOptionByShortName(c, optName)
397397
if optInfo == nil {
398398
return UnknownOptionError{Name: "-" + string(arg[charIdx])}
@@ -411,17 +411,17 @@ func parse(c *CommandInfo, p *Command, args []string) error {
411411
if i < len(args) {
412412
rawValue = args[i]
413413
} else {
414-
return MissingOptionValueError{Name: optName}
414+
return MissingOptionValueError{Name: string(optName)}
415415
}
416416
} else {
417417
rawValue = arg[charIdx+1:]
418418
skipRest = true
419419
}
420420
}
421421

422-
pi, err := newInput(optInfo, ParsedFrom{Opt: optName}, rawValue)
422+
pi, err := newInput(optInfo, ParsedFrom{Opt: string(optName)}, rawValue)
423423
if err != nil {
424-
return fmt.Errorf("parsing option '%s': %w", optName, err)
424+
return fmt.Errorf("parsing option '%c': %w", optName, err)
425425
}
426426

427427
if optInfo.HelpGen != nil {
@@ -461,10 +461,14 @@ func parse(c *CommandInfo, p *Command, args []string) error {
461461
}
462462

463463
var optInfo *InputInfo
464-
for i := range c.Opts {
465-
if name == c.Opts[i].NameShort || name == c.Opts[i].NameLong {
466-
optInfo = &c.Opts[i]
467-
break
464+
if len(name) == 1 {
465+
optInfo = lookupOptionByShortName(c, name[0])
466+
} else {
467+
for i := range c.Opts {
468+
if name == c.Opts[i].NameLong {
469+
optInfo = &c.Opts[i]
470+
break
471+
}
468472
}
469473
}
470474
if optInfo == nil {
@@ -508,7 +512,7 @@ func parse(c *CommandInfo, p *Command, args []string) error {
508512
if c.Opts[i].NameLong != "" {
509513
name = "--" + c.Opts[i].NameLong
510514
} else {
511-
name = "-" + c.Opts[i].NameShort
515+
name = "-" + string(c.Opts[i].NameShort)
512516
}
513517
missing = append(missing, name)
514518
}

help.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ func DefaultShortHelp(c *CommandInfo) string {
3131
u.WriteString("\noptions:\n")
3232
opts := slices.Clone(c.Opts)
3333
slices.SortStableFunc(opts, func(a, b InputInfo) int {
34-
nameToCmpA := a.NameShort
35-
nameToCmpB := b.NameShort
34+
nameToCmpA := string(a.NameShort)
35+
nameToCmpB := string(b.NameShort)
3636
if a.NameLong != "" {
3737
nameToCmpA = a.NameLong
3838
}
@@ -73,11 +73,11 @@ func DefaultShortHelp(c *CommandInfo) string {
7373
}
7474
var namesAndVal string
7575
{
76-
if o.NameShort != "" {
77-
namesAndVal += "-" + o.NameShort
76+
if o.NameShort != 0 {
77+
namesAndVal += "-" + string(o.NameShort)
7878
}
7979
if o.NameLong != "" {
80-
if o.NameShort != "" {
80+
if o.NameShort != 0 {
8181
namesAndVal += ", "
8282
}
8383
namesAndVal += "--" + o.NameLong
@@ -179,8 +179,8 @@ func DefaultFullHelp(c *CommandInfo) string {
179179
u.WriteString("\noptions:\n")
180180
opts := slices.Clone(c.Opts)
181181
slices.SortStableFunc(opts, func(a, b InputInfo) int {
182-
nameToCmpA := a.NameShort
183-
nameToCmpB := b.NameShort
182+
nameToCmpA := string(a.NameShort)
183+
nameToCmpB := string(b.NameShort)
184184
if a.NameLong != "" {
185185
nameToCmpA = a.NameLong
186186
}
@@ -200,11 +200,11 @@ func DefaultFullHelp(c *CommandInfo) string {
200200

201201
var usgNamesAndArg string
202202
{
203-
if o.NameShort != "" {
204-
usgNamesAndArg += "-" + o.NameShort
203+
if o.NameShort != 0 {
204+
usgNamesAndArg += "-" + string(o.NameShort)
205205
}
206206
if o.NameLong != "" {
207-
if o.NameShort != "" {
207+
if o.NameShort != 0 {
208208
usgNamesAndArg += ", "
209209
}
210210
usgNamesAndArg += "--" + o.NameLong
@@ -280,14 +280,14 @@ func DefaultFullHelp(c *CommandInfo) string {
280280

281281
func (o *InputInfo) leftPaddedNames() string {
282282
var s string
283-
if o.NameShort != "" {
284-
s += "-" + o.NameShort
283+
if o.NameShort != 0 {
284+
s += "-" + string(o.NameShort)
285285
} else {
286286
s += " "
287287
}
288288

289289
if o.NameLong != "" {
290-
if o.NameShort != "" {
290+
if o.NameShort != 0 {
291291
s += ", "
292292
} else {
293293
s += " "

0 commit comments

Comments
 (0)