diff --git a/cmd.go b/cmd.go new file mode 100644 index 00000000..f3f781e8 --- /dev/null +++ b/cmd.go @@ -0,0 +1,11 @@ +package main + +import ( + "os" + + "github.com/jmattheis/goverter/cmd" +) + +func main() { + cmd.Run(os.Args, cmd.RunOpts{}) +} diff --git a/cli/cli.go b/cmd/cli.go similarity index 95% rename from cli/cli.go rename to cmd/cli.go index 26928188..94b34bc2 100644 --- a/cli/cli.go +++ b/cmd/cli.go @@ -1,10 +1,9 @@ -package cli +package cmd import ( "flag" "fmt" - "github.com/jmattheis/goverter" "github.com/jmattheis/goverter/config" "github.com/jmattheis/goverter/enum" ) @@ -20,7 +19,7 @@ func (s *Strings) Set(value string) error { return nil } -func Parse(args []string) (*goverter.GenerateConfig, error) { +func ParseArgs(args []string) (*GenerateConfig, error) { switch len(args) { case 0: return nil, usage("unknown") @@ -52,7 +51,7 @@ func Parse(args []string) (*goverter.GenerateConfig, error) { return nil, usageErr("missing PATTERN", args[0]) } - c := goverter.GenerateConfig{ + c := GenerateConfig{ PackagePatterns: patterns, BuildTags: *buildTags, OutputBuildConstraint: *outputConstraint, diff --git a/cli/cli_test.go b/cmd/cli_test.go similarity index 75% rename from cli/cli_test.go rename to cmd/cli_test.go index 738cecc5..d2f0a7bc 100644 --- a/cli/cli_test.go +++ b/cmd/cli_test.go @@ -1,16 +1,16 @@ -package cli_test +package cmd_test import ( "strings" "testing" - "github.com/jmattheis/goverter" - "github.com/jmattheis/goverter/cli" + "github.com/jmattheis/goverter/cmd" "github.com/jmattheis/goverter/config" + "github.com/jmattheis/goverter/enum" "github.com/stretchr/testify/require" ) -func TestError(t *testing.T) { +func TestCLIError(t *testing.T) { tests := []struct { args []string contains string @@ -27,14 +27,14 @@ func TestError(t *testing.T) { for _, test := range tests { test := test t.Run(strings.Join(test.args, " "), func(t *testing.T) { - _, err := cli.Parse(test.args) + _, err := cmd.ParseArgs(test.args) require.ErrorContains(t, err, test.contains) }) } } -func TestSuccess(t *testing.T) { - actual, err := cli.Parse([]string{ +func TestCLISuccess(t *testing.T) { + actual, err := cmd.ParseArgs([]string{ "goverter", "gen", "-cwd", "file/path", @@ -47,11 +47,12 @@ func TestSuccess(t *testing.T) { }) require.NoError(t, err) - expected := &goverter.GenerateConfig{ + expected := &cmd.GenerateConfig{ PackagePatterns: []string{"pattern1", "pattern2"}, WorkingDir: "file/path", OutputBuildConstraint: "", BuildTags: "", + EnumTransformers: map[string]enum.Transformer{}, Global: config.RawLines{ Location: "command line (-g, -global)", Lines: []string{"g1", "g2", "g3 oops"}, @@ -60,15 +61,16 @@ func TestSuccess(t *testing.T) { require.Equal(t, expected, actual) } -func TestDefault(t *testing.T) { - actual, err := cli.Parse([]string{"goverter", "gen", "pattern"}) +func TestCLIDefault(t *testing.T) { + actual, err := cmd.ParseArgs([]string{"goverter", "gen", "pattern"}) require.NoError(t, err) - expected := &goverter.GenerateConfig{ + expected := &cmd.GenerateConfig{ PackagePatterns: []string{"pattern"}, WorkingDir: "", OutputBuildConstraint: "!goverter", BuildTags: "goverter", + EnumTransformers: map[string]enum.Transformer{}, Global: config.RawLines{ Location: "command line (-g, -global)", Lines: nil, diff --git a/runner.go b/cmd/generate.go similarity index 83% rename from runner.go rename to cmd/generate.go index ee8eda6d..8d317b22 100644 --- a/runner.go +++ b/cmd/generate.go @@ -1,4 +1,4 @@ -package goverter +package cmd import ( "os" @@ -24,21 +24,19 @@ type GenerateConfig struct { OutputBuildConstraint string // EnumTransformers describes additional enum transformers usable in the enum:transform setting. EnumTransformers map[string]enum.Transformer - // EnumDetecter is used to detect enum types and its members. - EnumDetecter enum.Detecter } -// GenerateConverters generates converters. +// GenerateConverters generate and writes converters to files. func GenerateConverters(c *GenerateConfig) error { - files, err := generateConvertersRaw(c) + files, err := GenerateConvertersRaw(c) if err != nil { return err } - return writeFiles(files) + return WriteFiles(files) } -func generateConvertersRaw(c *GenerateConfig) (map[string][]byte, error) { +func GenerateConvertersRaw(c *GenerateConfig) (map[string][]byte, error) { rawConverters, err := comments.ParseDocs(comments.ParseDocsConfig{ BuildTags: c.BuildTags, PackagePattern: c.PackagePatterns, @@ -57,7 +55,6 @@ func generateConvertersRaw(c *GenerateConfig) (map[string][]byte, error) { OuputBuildConstraint: c.OutputBuildConstraint, EnumTransformers: c.EnumTransformers, - EnumDetecter: c.EnumDetecter, }) if err != nil { return nil, err @@ -69,7 +66,7 @@ func generateConvertersRaw(c *GenerateConfig) (map[string][]byte, error) { }) } -func writeFiles(files map[string][]byte) error { +func WriteFiles(files map[string][]byte) error { for path, content := range files { if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return err diff --git a/cmd/goverter/main.go b/cmd/goverter/main.go index 00e86402..ee9f0607 100644 --- a/cmd/goverter/main.go +++ b/cmd/goverter/main.go @@ -4,19 +4,10 @@ import ( "fmt" "os" - goverter "github.com/jmattheis/goverter" - "github.com/jmattheis/goverter/cli" + "github.com/jmattheis/goverter/cmd" ) func main() { - cfg, err := cli.Parse(os.Args) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - - if err = goverter.GenerateConverters(cfg); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } + _, _ = fmt.Fprintln(os.Stderr, "github.com/jmattheis/goverter/cmd/goverter is deprecated, use github.com/jmattheis/goverter instead.") + cmd.Run(os.Args, cmd.RunOpts{}) } diff --git a/cmd/run.go b/cmd/run.go new file mode 100644 index 00000000..5afeceae --- /dev/null +++ b/cmd/run.go @@ -0,0 +1,30 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/jmattheis/goverter/enum" +) + +type RunOpts struct { + EnumTransformers map[string]enum.Transformer +} + +func Run(args []string, opts RunOpts) { + cfg, err := ParseArgs(args) + if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + if opts.EnumTransformers != nil { + for key, value := range opts.EnumTransformers { + cfg.EnumTransformers[key] = value + } + } + if err = GenerateConverters(cfg); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/runner_test.go b/scenario_test.go similarity index 97% rename from runner_test.go rename to scenario_test.go index e927cebf..93e1f4ba 100644 --- a/runner_test.go +++ b/scenario_test.go @@ -1,4 +1,4 @@ -package goverter +package main import ( "fmt" @@ -10,6 +10,7 @@ import ( "strings" "testing" + "github.com/jmattheis/goverter/cmd" "github.com/jmattheis/goverter/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -73,8 +74,8 @@ func TestScenario(t *testing.T) { patterns = append(patterns, "github.com/jmattheis/goverter/execution") } - files, err := generateConvertersRaw( - &GenerateConfig{ + files, err := cmd.GenerateConvertersRaw( + &cmd.GenerateConfig{ WorkingDir: testWorkDir, PackagePatterns: patterns, OutputBuildConstraint: scenario.BuildConstraint, @@ -111,7 +112,7 @@ func TestScenario(t *testing.T) { require.NotEmpty(t, scenario.Success, "scenario.Success may not be empty") require.Equal(t, scenario.Success, actualOutputFiles) - err = writeFiles(files) + err = cmd.WriteFiles(files) require.NoError(t, err) require.NoError(t, compile(testWorkDir), "generated converter doesn't build") })