From f5cbb58565ed6522a1e238dee63a9de3a606c647 Mon Sep 17 00:00:00 2001 From: Alex Bice Date: Thu, 11 Mar 2021 18:26:00 -0700 Subject: [PATCH] Add glob support (#50) --- Makefile | 3 +- example/globs/gen.go | 3 + example/globs/letter.go | 8 ++ example/globs/letter_enum.go | 139 +++++++++++++++++++++++++++++++++++ example/globs/number.go | 8 ++ example/globs/number_enum.go | 75 +++++++++++++++++++ main.go | 53 +++++++++---- 7 files changed, 272 insertions(+), 17 deletions(-) create mode 100644 example/globs/gen.go create mode 100644 example/globs/letter.go create mode 100644 example/globs/letter_enum.go create mode 100644 example/globs/number.go create mode 100644 example/globs/number_enum.go diff --git a/Makefile b/Makefile index 5d4efac4..99912d97 100644 --- a/Makefile +++ b/Makefile @@ -71,8 +71,7 @@ phony: clean tc build .PHONY: example example: - $(GO) generate ./example - + $(GO) generate ./example/... bin/goimports: go.sum $(call goinstall,golang.org/x/tools/cmd/goimports) diff --git a/example/globs/gen.go b/example/globs/gen.go new file mode 100644 index 00000000..f31bb06c --- /dev/null +++ b/example/globs/gen.go @@ -0,0 +1,3 @@ +//go:generate ../../bin/go-enum -f=*.go + +package globs diff --git a/example/globs/letter.go b/example/globs/letter.go new file mode 100644 index 00000000..016b45a7 --- /dev/null +++ b/example/globs/letter.go @@ -0,0 +1,8 @@ +package globs + +/** +ENUM( + a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z +) +*/ +type Letter int diff --git a/example/globs/letter_enum.go b/example/globs/letter_enum.go new file mode 100644 index 00000000..62212c5a --- /dev/null +++ b/example/globs/letter_enum.go @@ -0,0 +1,139 @@ +// Code generated by go-enum +// DO NOT EDIT! + +package globs + +import ( + "fmt" +) + +const ( + // LetterA is a Letter of type A. + LetterA Letter = iota + // LetterB is a Letter of type B. + LetterB + // LetterC is a Letter of type C. + LetterC + // LetterD is a Letter of type D. + LetterD + // LetterE is a Letter of type E. + LetterE + // LetterF is a Letter of type F. + LetterF + // LetterG is a Letter of type G. + LetterG + // LetterH is a Letter of type H. + LetterH + // LetterI is a Letter of type I. + LetterI + // LetterJ is a Letter of type J. + LetterJ + // LetterK is a Letter of type K. + LetterK + // LetterL is a Letter of type L. + LetterL + // LetterM is a Letter of type M. + LetterM + // LetterN is a Letter of type N. + LetterN + // LetterO is a Letter of type O. + LetterO + // LetterP is a Letter of type P. + LetterP + // LetterQ is a Letter of type Q. + LetterQ + // LetterR is a Letter of type R. + LetterR + // LetterS is a Letter of type S. + LetterS + // LetterT is a Letter of type T. + LetterT + // LetterU is a Letter of type U. + LetterU + // LetterV is a Letter of type V. + LetterV + // LetterW is a Letter of type W. + LetterW + // LetterX is a Letter of type X. + LetterX + // LetterY is a Letter of type Y. + LetterY + // LetterZ is a Letter of type Z. + LetterZ +) + +const _LetterName = "abcdefghijklmnopqrstuvwxyz" + +var _LetterMap = map[Letter]string{ + 0: _LetterName[0:1], + 1: _LetterName[1:2], + 2: _LetterName[2:3], + 3: _LetterName[3:4], + 4: _LetterName[4:5], + 5: _LetterName[5:6], + 6: _LetterName[6:7], + 7: _LetterName[7:8], + 8: _LetterName[8:9], + 9: _LetterName[9:10], + 10: _LetterName[10:11], + 11: _LetterName[11:12], + 12: _LetterName[12:13], + 13: _LetterName[13:14], + 14: _LetterName[14:15], + 15: _LetterName[15:16], + 16: _LetterName[16:17], + 17: _LetterName[17:18], + 18: _LetterName[18:19], + 19: _LetterName[19:20], + 20: _LetterName[20:21], + 21: _LetterName[21:22], + 22: _LetterName[22:23], + 23: _LetterName[23:24], + 24: _LetterName[24:25], + 25: _LetterName[25:26], +} + +// String implements the Stringer interface. +func (x Letter) String() string { + if str, ok := _LetterMap[x]; ok { + return str + } + return fmt.Sprintf("Letter(%d)", x) +} + +var _LetterValue = map[string]Letter{ + _LetterName[0:1]: 0, + _LetterName[1:2]: 1, + _LetterName[2:3]: 2, + _LetterName[3:4]: 3, + _LetterName[4:5]: 4, + _LetterName[5:6]: 5, + _LetterName[6:7]: 6, + _LetterName[7:8]: 7, + _LetterName[8:9]: 8, + _LetterName[9:10]: 9, + _LetterName[10:11]: 10, + _LetterName[11:12]: 11, + _LetterName[12:13]: 12, + _LetterName[13:14]: 13, + _LetterName[14:15]: 14, + _LetterName[15:16]: 15, + _LetterName[16:17]: 16, + _LetterName[17:18]: 17, + _LetterName[18:19]: 18, + _LetterName[19:20]: 19, + _LetterName[20:21]: 20, + _LetterName[21:22]: 21, + _LetterName[22:23]: 22, + _LetterName[23:24]: 23, + _LetterName[24:25]: 24, + _LetterName[25:26]: 25, +} + +// ParseLetter attempts to convert a string to a Letter +func ParseLetter(name string) (Letter, error) { + if x, ok := _LetterValue[name]; ok { + return x, nil + } + return Letter(0), fmt.Errorf("%s is not a valid Letter", name) +} diff --git a/example/globs/number.go b/example/globs/number.go new file mode 100644 index 00000000..5641814a --- /dev/null +++ b/example/globs/number.go @@ -0,0 +1,8 @@ +package globs + +/** +ENUM( + 0,1,2,3,4,5,6,7,8,9 +) +*/ +type Number int diff --git a/example/globs/number_enum.go b/example/globs/number_enum.go new file mode 100644 index 00000000..05472e72 --- /dev/null +++ b/example/globs/number_enum.go @@ -0,0 +1,75 @@ +// Code generated by go-enum +// DO NOT EDIT! + +package globs + +import ( + "fmt" +) + +const ( + // Number0 is a Number of type 0. + Number0 Number = iota + // Number1 is a Number of type 1. + Number1 + // Number2 is a Number of type 2. + Number2 + // Number3 is a Number of type 3. + Number3 + // Number4 is a Number of type 4. + Number4 + // Number5 is a Number of type 5. + Number5 + // Number6 is a Number of type 6. + Number6 + // Number7 is a Number of type 7. + Number7 + // Number8 is a Number of type 8. + Number8 + // Number9 is a Number of type 9. + Number9 +) + +const _NumberName = "0123456789" + +var _NumberMap = map[Number]string{ + 0: _NumberName[0:1], + 1: _NumberName[1:2], + 2: _NumberName[2:3], + 3: _NumberName[3:4], + 4: _NumberName[4:5], + 5: _NumberName[5:6], + 6: _NumberName[6:7], + 7: _NumberName[7:8], + 8: _NumberName[8:9], + 9: _NumberName[9:10], +} + +// String implements the Stringer interface. +func (x Number) String() string { + if str, ok := _NumberMap[x]; ok { + return str + } + return fmt.Sprintf("Number(%d)", x) +} + +var _NumberValue = map[string]Number{ + _NumberName[0:1]: 0, + _NumberName[1:2]: 1, + _NumberName[2:3]: 2, + _NumberName[3:4]: 3, + _NumberName[4:5]: 4, + _NumberName[5:6]: 5, + _NumberName[6:7]: 6, + _NumberName[7:8]: 7, + _NumberName[8:9]: 8, + _NumberName[9:10]: 9, +} + +// ParseNumber attempts to convert a string to a Number +func ParseNumber(name string) (Number, error) { + if x, ok := _NumberValue[name]; ok { + return x, nil + } + return Number(0), fmt.Errorf("%s is not a valid Number", name) +} diff --git a/main.go b/main.go index 0adbeae2..ff1623e0 100644 --- a/main.go +++ b/main.go @@ -111,7 +111,7 @@ func main() { }, }, Action: func(ctx *cli.Context) error { - for _, fileName := range argv.FileNames.Value() { + for _, fileOption := range argv.FileNames.Value() { g := generator.NewGenerator() @@ -152,24 +152,47 @@ func main() { g.WithSQLNullStr() } - originalName := fileName + var filenames []string - out("go-enum started. file: %s\n", color.Cyan(originalName)) - fileName, _ = filepath.Abs(fileName) - outFilePath := fmt.Sprintf("%s_enum.go", strings.TrimSuffix(fileName, filepath.Ext(fileName))) - - // Parse the file given in arguments - raw, err := g.GenerateFromFile(fileName) - if err != nil { - return fmt.Errorf("failed generating enums\nInputFile=%s\nError=%s", color.Cyan(fileName), color.RedBg(err)) + // In order to maintain existing capabilities, only glob when a * is in the path. + // Leave execution on par with old method in case there are bad patterns in use that somehow + // work without the Glob method. + if strings.Contains(fileOption, "*") { + matches, err := filepath.Glob(fileOption) + if err != nil { + return fmt.Errorf("failed parsing glob filepath\nInputFile=%s\nError=%s", color.Cyan(fileOption), color.RedBg(err)) + } + filenames = append(filenames, matches...) + } else { + filenames = append(filenames, fileOption) } - mode := int(0644) - err = ioutil.WriteFile(outFilePath, raw, os.FileMode(mode)) - if err != nil { - return fmt.Errorf("failed writing to file %s: %s", color.Cyan(outFilePath), color.Red(err)) + for _, fileName := range filenames { + originalName := fileName + + out("go-enum started. file: %s\n", color.Cyan(originalName)) + fileName, _ = filepath.Abs(fileName) + outFilePath := fmt.Sprintf("%s_enum.go", strings.TrimSuffix(fileName, filepath.Ext(fileName))) + + // Parse the file given in arguments + raw, err := g.GenerateFromFile(fileName) + if err != nil { + return fmt.Errorf("failed generating enums\nInputFile=%s\nError=%s", color.Cyan(fileName), color.RedBg(err)) + } + + // Nothing was generated, ignore the output and don't create a file. + if len(raw) < 1 { + out(color.Yellow("go-enum ignored. file: %s\n"), color.Cyan(originalName)) + continue + } + + mode := int(0644) + err = ioutil.WriteFile(outFilePath, raw, os.FileMode(mode)) + if err != nil { + return fmt.Errorf("failed writing to file %s: %s", color.Cyan(outFilePath), color.Red(err)) + } + out("go-enum finished. file: %s\n", color.Cyan(originalName)) } - out("go-enum finished. file: %s\n", color.Cyan(originalName)) } return nil