From 20b6b961fb21b47786c184e0ab2fb1fbc040cde7 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Thu, 19 Mar 2026 09:10:49 +0100 Subject: [PATCH] cli args moved from Init() to Parse() --- README.md | 2 ++ cli.go | 7 +++--- cli_test.go | 69 ++++++++++++++++++++++------------------------------- opt_test.go | 12 +++++----- 4 files changed, 41 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 9d5bbe7..989bc20 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ func main() { Refer to the unit test for a realistic example: [`cli_test.go`](cli_test.go). +## Usage + ## API Reference Key types and methods: diff --git a/cli.go b/cli.go index 47b54c2..11aab86 100644 --- a/cli.go +++ b/cli.go @@ -55,10 +55,9 @@ type CliParser struct { flags int16 } -func (cli *CliParser) Init(argv []string, version string, description string, flags ...int16) { +func (cli *CliParser) Init(version string, description string, flags ...int16) { cli.version = version cli.description = description - cli.cliArgs = argv for _, flag := range flags { cli.flags |= flag } @@ -245,9 +244,11 @@ func (cli *CliParser) parseCommandArgs(commandArgs []string) (err error) { return } -func (cli *CliParser) Parse() (err error) { +func (cli *CliParser) Parse(argv []string) (err error) { var commandArgs []string + cli.cliArgs = argv + cli.addHelpAndVersion() // first parse options and collect command arguments in the args array diff --git a/cli_test.go b/cli_test.go index 8738195..1f6350d 100644 --- a/cli_test.go +++ b/cli_test.go @@ -33,7 +33,7 @@ func TestVerbose(t *testing.T) { t.Error(err) return } - if err := cli.Parse(); err != nil { + if err := cli.Parse(commonArgs()); err != nil { t.Error(err) } else if gd.verbose != 3 { t.Errorf("Expected verbose level 3, got %d", gd.verbose) @@ -134,7 +134,7 @@ Option: version, Type: n/a, Value: return } tracer := NewSimpleOptionTracer(&sb) - if err := cli.Parse(); err == nil { + if err := cli.Parse(commonArgs()); err == nil { cli.TraceOptions(tracer) if sb.String() != expectedOutput { t.Errorf("Parsed options do not match expected list.\nGot:\n%q\nExpected:\n%q", sb.String(), expectedOutput) @@ -144,8 +144,8 @@ Option: version, Type: n/a, Value: } } -func initCli(cli *CliParser, gd *GlobalData) (err error) { - args := []string{ +func commonArgs() []string { + return []string{ "ddt-ocr", "--log", "all", "-t", @@ -157,7 +157,10 @@ func initCli(cli *CliParser, gd *GlobalData) (err error) { "--input-name=my-scan.pdf", "scan1.pdf", "scan2.pdf", "result.txt", "report.txt", } - cli.Init(args, version, "cli-test") +} + +func initCli(cli *CliParser, gd *GlobalData) (err error) { + cli.Init(version, "cli-test") err = gd.addOptions(cli) return } @@ -168,8 +171,8 @@ func TestOptErrorUnknownOption(t *testing.T) { var cli CliParser var gd GlobalData - if err := initCliUnknownOption(&cli, &gd, unknownOption); err == nil { - if err = cli.Parse(); err != nil { + if err := initCliUnknownOption(&cli, &gd); err == nil { + if err = cli.Parse(commonBadArgs(unknownOption)); err != nil { if err.Error() != expectedErr.Error() { t.Errorf("Invalid error message.\nGot:\n%v\nExpected:\n%v", err, expectedErr) } @@ -182,13 +185,15 @@ func TestOptErrorUnknownOption(t *testing.T) { } } -func initCliUnknownOption(cli *CliParser, gd *GlobalData, option string) (err error) { - args := []string{ +func commonBadArgs(option string) []string { + return []string{ "ddt-ocr", option, "scan1.pdf", "scan2.pdf", "result.txt", "report.txt", } - cli.Init(args, version, "cli-test") +} +func initCliUnknownOption(cli *CliParser, gd *GlobalData) (err error) { + cli.Init(version, "cli-test") err = gd.addOptions(cli) return } @@ -199,8 +204,8 @@ func TestOptErrorMissingOptionValue(t *testing.T) { var cli CliParser var gd GlobalData - if err := initCliMissingOptionValue(&cli, &gd, missingValueOption); err == nil { - if err = cli.Parse(); err != nil { + if err := initCliMissingOptionValue(&cli, &gd); err == nil { + if err = cli.Parse(commonBadArgs(missingValueOption)); err != nil { if err.Error() != expectedErr.Error() { t.Errorf("Invalid error message.\nGot:\n%v\nExpected:\n%v", err, expectedErr) } @@ -213,25 +218,20 @@ func TestOptErrorMissingOptionValue(t *testing.T) { } } -func initCliMissingOptionValue(cli *CliParser, gd *GlobalData, option string) (err error) { - args := []string{ - "ddt-ocr", - option, - "scan1.pdf", "scan2.pdf", "result.txt", "report.txt", - } - cli.Init(args, version, "cli-test") +func initCliMissingOptionValue(cli *CliParser, gd *GlobalData) (err error) { + cli.Init(version, "cli-test") err = gd.addOptions(cli) return } func TestOptErrorInvalidOptionValue(t *testing.T) { const missingInvalidValueOption = "--page" - var expectedErr = errInvalidOptionValue("page", "some", "num-array") + var expectedErr = errInvalidOptionValue("page", "scan1.pdf", "num-array") var cli CliParser var gd GlobalData - if err := initCliInvalidOptionValue(&cli, &gd, missingInvalidValueOption); err == nil { - if err = cli.Parse(); err != nil { + if err := initCliInvalidOptionValue(&cli, &gd); err == nil { + if err = cli.Parse(commonBadArgs(missingInvalidValueOption)); err != nil { if err.Error() != expectedErr.Error() { t.Errorf("Invalid error message.\nGot:\n%v\nExpected:\n%v", err, expectedErr) } @@ -244,13 +244,8 @@ func TestOptErrorInvalidOptionValue(t *testing.T) { } } -func initCliInvalidOptionValue(cli *CliParser, gd *GlobalData, option string) (err error) { - args := []string{ - "ddt-ocr", - option, "some", - "scan1.pdf", "scan2.pdf", "result.txt", "report.txt", - } - cli.Init(args, version, "cli-test") +func initCliInvalidOptionValue(cli *CliParser, gd *GlobalData) (err error) { + cli.Init(version, "cli-test") err = gd.addOptions(cli) return } @@ -262,7 +257,7 @@ func TestArgErrorMissingRequired(t *testing.T) { var gd GlobalData if err := initCliMissingRequiredArg(&cli, &gd); err == nil { - if err = cli.Parse(); err != nil { + if err = cli.Parse([]string{"ddt-ocr"}); err != nil { if err.Error() != expectedErr.Error() { t.Errorf("Invalid error message.\nGot:\n%v\nExpected:\n%v", err, expectedErr) } @@ -276,15 +271,12 @@ func TestArgErrorMissingRequired(t *testing.T) { } func initCliMissingRequiredArg(cli *CliParser, gd *GlobalData) (err error) { - args := []string{ - "ddt-ocr", - } - cli.Init(args, version, "cli-test") + cli.Init(version, "cli-test") err = gd.addOptions(cli) return } -func TestArgErrorRepeat(t *testing.T) { +func TestArgErrorRepeatProperty(t *testing.T) { var expectedErr = fmt.Errorf(`repeat property already set for arg `) var cli CliParser var gd GlobalData @@ -299,17 +291,14 @@ func TestArgErrorRepeat(t *testing.T) { } func initCliRepeatArg(cli *CliParser, gd *GlobalData) (err error) { - args := []string{ - "ddt-ocr", - "scan1.pdf", "scan2.pdf", "result.txt", "report.txt", - } - cli.Init(args, version, "cli-test") + cli.Init(version, "cli-test") if err = gd.addOptions(cli); err == nil { defer func() { if r := recover(); r != nil { err = r.(error) } }() + // This will raise error because we can't declare two args array cli.AddStringArrayArg("other", true, nil, "other args") cli.AddStringArrayArg("other2", true, nil, "other args 2") } diff --git a/opt_test.go b/opt_test.go index 473c034..70bfd89 100644 --- a/opt_test.go +++ b/opt_test.go @@ -26,8 +26,8 @@ func TestOneOptWithEqual(t *testing.T) { "--color=blue", } - cli.Init(args, "1.0.0", "TestOneOptWithEqual description") - if err := cli.Parse(); err != nil { + cli.Init("1.0.0", "TestOneOptWithEqual description") + if err := cli.Parse(args); err != nil { t.Error(err) } else if color != "blue" { t.Errorf("Expected color blue, got %q", color) @@ -54,8 +54,8 @@ func testIntArrayOptOk(t *testing.T, n int, args []string, flags ...int16) { var cli CliParser t.Logf("Arg set n. %d", n) addBoxOption(&cli, &box) - cli.Init(args, "1.0.0", "TestIntArrayOpt description", flags...) - if err := cli.Parse(); err != nil { + cli.Init("1.0.0", "TestIntArrayOpt description", flags...) + if err := cli.Parse(args); err != nil { t.Error(err) } else if len(box) != 4 { t.Errorf(`Expected 4 items, got %d`, len(box)) @@ -67,8 +67,8 @@ func testIntArrayOptKo(t *testing.T, n int, args []string, msg string, flags ... var cli CliParser t.Logf("Arg set n. %d", n) addBoxOption(&cli, &box) - cli.Init(args, "1.0.0", "TestIntArrayOpt description", flags...) - if err := cli.Parse(); err == nil { + cli.Init("1.0.0", "TestIntArrayOpt description", flags...) + if err := cli.Parse(args); err == nil { t.Errorf("Expected error, got nil") } else if err.Error() != msg { t.Errorf(`Invalid error: %q; expected: %q`, err.Error(), msg)