github.com/profzone/eden-framework@v1.0.10/internal/generator/enum_generator.go (about) 1 package generator 2 3 import ( 4 "github.com/profzone/eden-framework/internal/generator/files" 5 "github.com/profzone/eden-framework/internal/generator/scanner" 6 "github.com/profzone/eden-framework/pkg/packagex" 7 str "github.com/profzone/eden-framework/pkg/strings" 8 "github.com/sirupsen/logrus" 9 "go/ast" 10 "go/build" 11 "golang.org/x/tools/go/packages" 12 "os" 13 "path" 14 "path/filepath" 15 ) 16 17 type EnumGenerator struct { 18 pkg *packagex.Package 19 scanner *scanner.EnumScanner 20 TypeName string 21 } 22 23 func NewEnumGenerator(typeName string) *EnumGenerator { 24 return &EnumGenerator{ 25 TypeName: typeName, 26 } 27 } 28 29 func (e *EnumGenerator) Load(cwd string) { 30 _, err := os.Stat(cwd) 31 if err != nil { 32 if !os.IsExist(err) { 33 logrus.Panicf("entry path does not exist: %s", cwd) 34 } 35 } 36 pkg, err := packagex.Load(cwd) 37 if err != nil { 38 logrus.Panic(err) 39 } 40 41 e.pkg = pkg 42 e.scanner = scanner.NewEnumScanner(pkg) 43 } 44 45 func (e *EnumGenerator) Pick() { 46 packages.Visit(e.pkg.AllPackages, nil, func(i *packages.Package) { 47 for _, f := range i.Syntax { 48 commentScanner := scanner.NewCommentScanner(i.Fset, f) 49 ast.Inspect(f, func(node ast.Node) bool { 50 typeSpec, ok := node.(*ast.TypeSpec) 51 if !ok { 52 return true 53 } 54 doc := commentScanner.CommentsOf(typeSpec) 55 doc, hasEnum := scanner.ParseEnum(doc) 56 57 if hasEnum { 58 if e.TypeName != "" { 59 if e.TypeName == typeSpec.Name.Name { 60 e.scanner.Enum(e.pkg.TypeName(typeSpec.Name.Name)) 61 } 62 } else { 63 e.scanner.Enum(e.pkg.TypeName(typeSpec.Name.Name)) 64 } 65 } 66 67 return true 68 }) 69 } 70 }) 71 } 72 73 func (e *EnumGenerator) Output(outputPath string) Outputs { 74 outputs := Outputs{} 75 for typeName, enum := range e.scanner.EnumSet { 76 p, _ := build.Import(typeName.Pkg().Path(), "", build.FindOnly) 77 dir, _ := filepath.Rel(outputPath, p.Dir) 78 79 enum := files.NewEnum(typeName.Pkg().Path(), typeName.Pkg().Name(), typeName.Name(), enum, e.scanner.HasOffset(typeName)) 80 outputs.Add(GeneratedSuffix(path.Join(dir, str.ToLowerSnakeCase(typeName.Name())+".go")), enum.String()) 81 } 82 return outputs 83 }