diff --git a/bool_test.go b/bool_test.go index a85e7873..bf866cd4 100644 --- a/bool_test.go +++ b/bool_test.go @@ -4,8 +4,8 @@ package pflag import ( - "bytes" "strconv" + "strings" "testing" ) @@ -154,7 +154,7 @@ func TestImplicitFalse(t *testing.T) { func TestInvalidValue(t *testing.T) { var tristate triStateValue f := setUpFlagSet(&tristate) - var buf bytes.Buffer + var buf strings.Builder f.SetOutput(&buf) err := f.Parse([]string{"--tristate=invalid"}) if err == nil { diff --git a/bytes.go b/bytes.go index 1a216815..bfdee704 100644 --- a/bytes.go +++ b/bytes.go @@ -49,7 +49,7 @@ func bytesHexConv(sval string) (interface{}, error) { return bin, nil } - return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err) + return nil, fmt.Errorf("invalid string being converted to Bytes: %s %w", sval, err) } // GetBytesHex return the []byte value of a flag with the given name @@ -178,7 +178,7 @@ func bytesBase64ValueConv(sval string) (interface{}, error) { return bin, nil } - return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err) + return nil, fmt.Errorf("invalid string being converted to Bytes: %s %w", sval, err) } // GetBytesBase64 return the []byte value of a flag with the given name diff --git a/count.go b/count.go index 328bbbcc..3601e1f9 100644 --- a/count.go +++ b/count.go @@ -16,7 +16,7 @@ func newCountValue(val int, p *int) *countValue { func (i *countValue) Set(s string) error { // "+1" means that no specific value was passed, so increment if s == "+1" { - *i = countValue(*i + 1) + *i++ return nil } v, err := strconv.ParseInt(s, 0, 0) diff --git a/flag.go b/flag.go index 2a568339..56716359 100644 --- a/flag.go +++ b/flag.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "errors" goflag "flag" "fmt" @@ -430,7 +429,7 @@ func (f *FlagSet) Set(name, value string) error { } else { flagName = fmt.Sprintf("--%s", flag.Name) } - return fmt.Errorf("invalid argument %q for %q flag: %v", value, flagName, err) + return fmt.Errorf("invalid argument %q for %q flag: %w", value, flagName, err) } if !flag.Changed { @@ -607,7 +606,7 @@ func wrapN(i, slop int, s string) (string, string) { // caller). Pass `w` == 0 to do no wrapping func wrap(i, w int, s string) string { if w == 0 { - return strings.Replace(s, "\n", "\n"+strings.Repeat(" ", i), -1) + return strings.ReplaceAll(s, "\n", "\n"+strings.Repeat(" ", i)) } // space between indent i and end of line width w into which @@ -625,7 +624,7 @@ func wrap(i, w int, s string) string { } // If still not enough space then don't even try to wrap. if wrap < 24 { - return strings.Replace(s, "\n", r, -1) + return strings.ReplaceAll(s, "\n", r) } // Try to avoid short orphan words on the final line, by @@ -637,35 +636,33 @@ func wrap(i, w int, s string) string { // Handle first line, which is indented by the caller (or the // special case above) l, s = wrapN(wrap, slop, s) - r = r + strings.Replace(l, "\n", "\n"+strings.Repeat(" ", i), -1) + r = r + strings.ReplaceAll(l, "\n", "\n"+strings.Repeat(" ", i)) // Now wrap the rest for s != "" { var t string t, s = wrapN(wrap, slop, s) - r = r + "\n" + strings.Repeat(" ", i) + strings.Replace(t, "\n", "\n"+strings.Repeat(" ", i), -1) + r = r + "\n" + strings.Repeat(" ", i) + strings.ReplaceAll(t, "\n", "\n"+strings.Repeat(" ", i)) } return r - } // FlagUsagesWrapped returns a string containing the usage information // for all flags in the FlagSet. Wrapped to `cols` columns (0 for no // wrapping) func (f *FlagSet) FlagUsagesWrapped(cols int) string { - buf := new(bytes.Buffer) - - lines := make([]string, 0, len(f.formal)) - - maxlen := 0 + var ( + max, maxlen int + lines = make([]string, 0, len(f.formal)) + ) f.VisitAll(func(flag *Flag) { if flag.Hidden { return } - line := "" + var line string if flag.Shorthand != "" && flag.ShorthandDeprecated == "" { line = fmt.Sprintf(" -%s", flag.Shorthand) if !flag.ShorthandOnly { @@ -716,8 +713,11 @@ func (f *FlagSet) FlagUsagesWrapped(cols int) string { } lines = append(lines, line) + max += len(line) }) + buf := new(strings.Builder) + buf.Grow(max) for _, line := range lines { sidx := strings.Index(line, "\x00") spacing := strings.Repeat(" ", maxlen-sidx) @@ -1149,10 +1149,6 @@ func (f *FlagSet) parseAll(arguments []string, fn parseFunc) error { } f.parsed = true - if len(arguments) < 0 { - return nil - } - f.args = make([]string, 0, len(arguments)) err := f.parseArgs(arguments, fn) diff --git a/flag_test.go b/flag_test.go index 9f7dd152..fa702f47 100644 --- a/flag_test.go +++ b/flag_test.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "fmt" "io" "io/ioutil" @@ -673,7 +672,7 @@ func TestChangedHelper(t *testing.T) { func replaceSeparators(name string, from []string, to string) string { result := name for _, sep := range from { - result = strings.Replace(result, sep, to, -1) + result = strings.ReplaceAll(result, sep, to) } // Type convert to indicate normalization has been done. return result @@ -899,7 +898,7 @@ func TestUserDefined(t *testing.T) { func TestSetOutput(t *testing.T) { var flags FlagSet - var buf bytes.Buffer + var buf strings.Builder flags.SetOutput(&buf) flags.Init("test", ContinueOnError) flags.Parse([]string{"--unknown"}) @@ -910,7 +909,7 @@ func TestSetOutput(t *testing.T) { func TestOutput(t *testing.T) { var flags FlagSet - var buf bytes.Buffer + var buf strings.Builder expect := "an example string" flags.SetOutput(&buf) fmt.Fprint(flags.Output(), expect) @@ -927,8 +926,8 @@ func TestOutputExitOnError(t *testing.T) { t.Fatal("this error should not be triggered") return } - mockStdout := bytes.NewBufferString("") - mockStderr := bytes.NewBufferString("") + mockStdout := new(strings.Builder) + mockStderr := new(strings.Builder) cmd := exec.Command(os.Args[0], "-test.run="+t.Name()) cmd.Env = append(os.Environ(), "PFLAG_CRASH_TEST=1") cmd.Stdout = mockStdout @@ -1161,7 +1160,7 @@ func getDeprecatedFlagSet() *FlagSet { func TestDeprecatedFlagInDocs(t *testing.T) { f := getDeprecatedFlagSet() - out := new(bytes.Buffer) + out := new(strings.Builder) f.SetOutput(out) f.PrintDefaults() @@ -1178,7 +1177,7 @@ func TestUnHiddenDeprecatedFlagInDocs(t *testing.T) { } flg.Hidden = false - out := new(bytes.Buffer) + out := new(strings.Builder) f.SetOutput(out) f.PrintDefaults() @@ -1197,7 +1196,7 @@ func TestDeprecatedFlagShorthandInDocs(t *testing.T) { f.BoolP(name, "n", true, "always true") f.MarkShorthandDeprecated("noshorthandflag", fmt.Sprintf("use --%s instead", name)) - out := new(bytes.Buffer) + out := new(strings.Builder) f.SetOutput(out) f.PrintDefaults() @@ -1216,7 +1215,7 @@ func parseReturnStderr(t *testing.T, f *FlagSet, args []string) (string, error) outC := make(chan string) // copy the output in a separate goroutine so printing can't block indefinitely go func() { - var buf bytes.Buffer + var buf strings.Builder io.Copy(&buf, r) outC <- buf.String() }() @@ -1300,7 +1299,7 @@ func TestHiddenFlagInUsage(t *testing.T) { f.Bool("secretFlag", true, "shhh") f.MarkHidden("secretFlag") - out := new(bytes.Buffer) + out := new(strings.Builder) f.SetOutput(out) f.PrintDefaults() @@ -1365,7 +1364,7 @@ func (cv *customValue) Type() string { return "custom" } func TestPrintDefaults(t *testing.T) { fs := NewFlagSet("print defaults test", ContinueOnError) - var buf bytes.Buffer + var buf strings.Builder fs.SetOutput(&buf) fs.Bool("A", false, "for bootstrapping, allow 'any' type") fs.Bool("Alongflagname", false, "disable bounds checking") @@ -1401,8 +1400,6 @@ func TestPrintDefaults(t *testing.T) { fs.PrintDefaults() got := buf.String() if got != defaultOutput { - fmt.Println("\n" + got) - fmt.Println("\n" + defaultOutput) t.Errorf("got %q want %q\n", got, defaultOutput) } } @@ -1449,7 +1446,7 @@ func TestVisitFlagOrder(t *testing.T) { func TestUnquoteUsage(t *testing.T) { - var buf bytes.Buffer + var buf strings.Builder var fs = NewFlagSet(t.Name(), ContinueOnError) fs.SetOutput(&buf) want := "Usage of TestUnquoteUsage:\n" diff --git a/ip.go b/ip.go index 3aebd97c..b0bb239c 100644 --- a/ip.go +++ b/ip.go @@ -19,6 +19,9 @@ func newIPValue(val net.IP, p *net.IP) *ipValue { func (i *ipValue) String() string { return net.IP(*i).String() } func (i *ipValue) Set(s string) error { + if s == "" { + return nil + } ip := net.ParseIP(strings.TrimSpace(s)) if ip == nil { return fmt.Errorf("failed to parse IP: %q", s) @@ -32,8 +35,7 @@ func (i *ipValue) Type() string { } func ipConv(sval string) (interface{}, error) { - ip := net.ParseIP(sval) - if ip != nil { + if ip := net.ParseIP(sval); ip != nil { return ip, nil } return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval) diff --git a/ip_slice.go b/ip_slice.go index ffd8e1d3..c90dafa4 100644 --- a/ip_slice.go +++ b/ip_slice.go @@ -75,8 +75,8 @@ func (s *ipSliceValue) String() string { return "[" + out + "]" } -func (s *ipSliceValue) fromString(val string) (net.IP, error) { - return net.ParseIP(strings.TrimSpace(val)), nil +func (s *ipSliceValue) fromString(val string) net.IP { + return net.ParseIP(strings.TrimSpace(val)) } func (s *ipSliceValue) toString(val net.IP) string { @@ -84,10 +84,7 @@ func (s *ipSliceValue) toString(val net.IP) string { } func (s *ipSliceValue) Append(val string) error { - i, err := s.fromString(val) - if err != nil { - return err - } + i := s.fromString(val) *s.value = append(*s.value, i) return nil } @@ -95,11 +92,7 @@ func (s *ipSliceValue) Append(val string) error { func (s *ipSliceValue) Replace(val []string) error { out := make([]net.IP, len(val)) for i, d := range val { - var err error - out[i], err = s.fromString(d) - if err != nil { - return err - } + out[i] = s.fromString(d) } *s.value = out return nil diff --git a/ip_test.go b/ip_test.go index 331d1d56..d5e4b853 100644 --- a/ip_test.go +++ b/ip_test.go @@ -27,7 +27,7 @@ func TestIP(t *testing.T) { {"1.2.3.4", true, "1.2.3.4"}, {"127.0.0.1", true, "127.0.0.1"}, {"255.255.255.255", true, "255.255.255.255"}, - {"", false, ""}, + {"", true, "0.0.0.0"}, {"0", false, ""}, {"localhost", false, ""}, {"0.0.0", false, ""}, diff --git a/printusage_test.go b/printusage_test.go index 203c6402..2cf7affd 100644 --- a/printusage_test.go +++ b/printusage_test.go @@ -4,8 +4,8 @@ package pflag import ( - "bytes" "io" + "strings" "testing" ) @@ -28,7 +28,7 @@ func setUpPFlagSet(buf io.Writer) *FlagSet { } func TestPrintUsage(t *testing.T) { - buf := bytes.Buffer{} + var buf strings.Builder f := setUpPFlagSet(&buf) f.PrintDefaults() res := buf.String() @@ -68,7 +68,7 @@ const expectedOutput2 = ` --long-form Some description ` func TestPrintUsage_2(t *testing.T) { - buf := bytes.Buffer{} + var buf strings.Builder f := setUpPFlagSet2(&buf) res := f.FlagUsagesWrapped(80) if res != expectedOutput2 { diff --git a/string_slice.go b/string_slice.go index 759ea4fb..3154b97b 100644 --- a/string_slice.go +++ b/string_slice.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "encoding/csv" "strings" ) @@ -32,7 +31,7 @@ func readAsCSV(val string) ([]string, error) { } func writeAsCSV(vals []string) (string, error) { - b := &bytes.Buffer{} + b := new(strings.Builder) w := csv.NewWriter(b) err := w.Write(vals) if err != nil { diff --git a/string_to_int.go b/string_to_int.go index a672df00..d4b595db 100644 --- a/string_to_int.go +++ b/string_to_int.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "fmt" "strconv" "strings" @@ -54,7 +53,7 @@ func (s *stringToIntValue) Type() string { } func (s *stringToIntValue) String() string { - var buf bytes.Buffer + var buf strings.Builder i := 0 for k, v := range *s.value { if i > 0 { diff --git a/string_to_int64.go b/string_to_int64.go index bb6d043c..e0a1e211 100644 --- a/string_to_int64.go +++ b/string_to_int64.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "fmt" "strconv" "strings" @@ -54,7 +53,7 @@ func (s *stringToInt64Value) Type() string { } func (s *stringToInt64Value) String() string { - var buf bytes.Buffer + var buf strings.Builder i := 0 for k, v := range *s.value { if i > 0 { diff --git a/string_to_int64_test.go b/string_to_int64_test.go index 970de225..34123b62 100644 --- a/string_to_int64_test.go +++ b/string_to_int64_test.go @@ -4,9 +4,9 @@ package pflag import ( - "bytes" "fmt" "strconv" + "strings" "testing" ) @@ -23,7 +23,7 @@ func setUpS2I64FlagSetWithDefault(s2ip *map[string]int64) *FlagSet { } func createS2I64Flag(vals map[string]int64) string { - var buf bytes.Buffer + var buf strings.Builder i := 0 for k, v := range vals { if i > 0 { diff --git a/string_to_int_test.go b/string_to_int_test.go index 9fda4376..838415c3 100644 --- a/string_to_int_test.go +++ b/string_to_int_test.go @@ -4,9 +4,9 @@ package pflag import ( - "bytes" "fmt" "strconv" + "strings" "testing" ) @@ -23,7 +23,7 @@ func setUpS2IFlagSetWithDefault(s2ip *map[string]int) *FlagSet { } func createS2IFlag(vals map[string]int) string { - var buf bytes.Buffer + var buf strings.Builder i := 0 for k, v := range vals { if i > 0 { diff --git a/string_to_string.go b/string_to_string.go index bda81ae3..b3dae9f1 100644 --- a/string_to_string.go +++ b/string_to_string.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "encoding/csv" "fmt" "strings" @@ -70,7 +69,7 @@ func (s *stringToStringValue) String() string { records = append(records, k+"="+v) } - var buf bytes.Buffer + var buf strings.Builder w := csv.NewWriter(&buf) if err := w.Write(records); err != nil { panic(err) diff --git a/string_to_string_test.go b/string_to_string_test.go index b192c1fe..633ccb16 100644 --- a/string_to_string_test.go +++ b/string_to_string_test.go @@ -4,7 +4,6 @@ package pflag import ( - "bytes" "encoding/csv" "fmt" "strings" @@ -29,7 +28,7 @@ func createS2SFlag(vals map[string]string) string { records = append(records, k+"="+v) } - var buf bytes.Buffer + var buf strings.Builder w := csv.NewWriter(&buf) if err := w.Write(records); err != nil { panic(err) diff --git a/uint64.go b/uint64.go index c930fb7f..8e4d8c52 100644 --- a/uint64.go +++ b/uint64.go @@ -30,7 +30,7 @@ func uint64Conv(sval string) (interface{}, error) { if err != nil { return 0, err } - return uint64(v), nil + return v, nil } // GetUint64 return the uint64 value of a flag with the given name