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  }