github.com/go-generalize/volcago@v1.7.0/generator/generator.go (about)

     1  package generator
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/go-generalize/go-easyparser"
     7  	"github.com/go-generalize/go-easyparser/types"
     8  	"golang.org/x/xerrors"
     9  )
    10  
    11  // Generator generates firestore CRUD functions
    12  type Generator struct {
    13  	dir   string
    14  	types map[string]types.Type
    15  
    16  	AppVersion string
    17  }
    18  
    19  func NewGenerator(dir string) (*Generator, error) {
    20  	psr, err := easyparser.NewParser(dir, func(fo *easyparser.FilterOpt) bool {
    21  		return fo.BasePackage
    22  	})
    23  
    24  	if err != nil {
    25  		return nil, xerrors.Errorf("failed to initialize parser: %w", err)
    26  	}
    27  	psr.Replacer = replacer
    28  
    29  	types, err := psr.Parse()
    30  
    31  	if err != nil {
    32  		return nil, xerrors.Errorf("failed to parse: %w", err)
    33  	}
    34  
    35  	return &Generator{
    36  		dir:   dir,
    37  		types: types,
    38  
    39  		AppVersion: "devel",
    40  	}, nil
    41  }
    42  
    43  // GenerateOption is a parameter to generate repository
    44  type GenerateOption struct {
    45  	OutputDir                  string
    46  	PackageName                string
    47  	CollectionName             string
    48  	MockGenPath                string
    49  	MockOutputPath             string
    50  	DisableMetaFieldsDetection bool
    51  	Subcollection              bool
    52  }
    53  
    54  // NewDefaultGenerateOption returns a default GenerateOption
    55  func NewDefaultGenerateOption() GenerateOption {
    56  	return GenerateOption{
    57  		OutputDir:                  ".",
    58  		MockGenPath:                "mockgen",
    59  		MockOutputPath:             "mock/mock_{{ .GeneratedFileName }}/mock_{{ .GeneratedFileName }}.go",
    60  		DisableMetaFieldsDetection: false,
    61  	}
    62  }
    63  
    64  func (g *Generator) Generate(structName string, opt GenerateOption) error {
    65  	var typ *types.Object
    66  	for k, v := range g.types {
    67  		split := strings.Split(k, ".")
    68  		t := split[len(split)-1]
    69  
    70  		if t == structName {
    71  			t, ok := v.(*types.Object)
    72  
    73  			if !ok {
    74  				return xerrors.Errorf("Only struct is allowed")
    75  			}
    76  			typ = t
    77  		}
    78  	}
    79  
    80  	if typ == nil {
    81  		return xerrors.Errorf("struct not found: %s", structName)
    82  	}
    83  
    84  	gen, err := newStructGenerator(typ, structName, g.AppVersion, opt)
    85  
    86  	if err != nil {
    87  		return xerrors.Errorf("failed to initialize generator: %w", err)
    88  	}
    89  
    90  	if err := gen.parseType(); err != nil {
    91  		return xerrors.Errorf("failed to parse type: %w", err)
    92  	}
    93  
    94  	if err := gen.generate(); err != nil {
    95  		return xerrors.Errorf("failed to generate files: %w", err)
    96  	}
    97  
    98  	return nil
    99  }