Documentation ¶
Overview ¶
Package simplegen helps developer to generate code.
For codegen more complex than just generate small piece of code usually need to parse source code and build ast.Tree. Simplegen will take this part and give developer exact ast.Node to work with.
Also, simplegen provides tools for easy finding ast.Node.
Example:
package main import ( "flag" "fmt" "go/ast" "golang.org/x/tools/go/packages" "github.com/AlwxSin/simplegen" ) var PaginatorTemplate = ` {{ range $key, $struct := .Specs }} // {{$struct.Name}}ListPaginated represents {{$struct.Name}} list in a pagination container. type {{$struct.Name}}ListPaginated struct { CurrentCursor *string ` + "`json:\"currentCursor\"`\n" + ` NextCursor *string ` + "`json:\"nextCursor\"`\n" + ` Results []*{{$struct.Name}} ` + "`json:\"results\"`\n" + ` isPaginated bool limit int offset int } ` func Paginator( sg *simplegen.SimpleGenerator, pkg *packages.Package, node *ast.TypeSpec, comment *ast.Comment, ) (templateData simplegen.SpecData, imports []string, err error) { imports = append(imports, "strconv") type PaginatorTypeSpec struct { Name string } tmplData := &PaginatorTypeSpec{ Name: node.Name.Name, } return simplegen.SpecData(tmplData), imports, nil } // simplegen:paginator type User struct { Email string } func main() { var pn simplegen.PackageNames flag.Var(&pn, "package", "Package where simplegen should find magic comments") flag.Parse() sg, err := simplegen.NewSimpleGenerator(pn, simplegen.GeneratorsMap{ "paginator": simplegen.TemplateGenerator{ Template: PaginatorTemplate, GeneratorFunc: Paginator, }, }, nil) if err != nil { fmt.Println(err) return } err = sg.Generate() if err != nil { fmt.Println(err) } }
In result simplegen will generate file with following content Example:
// UserListPaginated represents User list in a pagination container. type UserListPaginated struct { CurrentCursor *string `json:"currentCursor"` NextCursor *string `json:"nextCursor"` Results []*User `json:"results"` isPaginated bool limit int offset int }
See /examples dir for more detailed usage.
Index ¶
- Constants
- type GeneratorFunc
- type GeneratorName
- type GeneratorsMap
- type PackageNames
- type SimpleGenerator
- func (sg *SimpleGenerator) Generate() error
- func (sg *SimpleGenerator) GetObject(pkg *packages.Package, typeName string) (types.Object, error)
- func (sg *SimpleGenerator) GetPackage(path string) (*packages.Package, error)
- func (sg *SimpleGenerator) GetStructType(pkg *packages.Package, typeName string) (*types.Struct, error)
- type SpecData
- type TemplateGenerator
Constants ¶
const CmdKey = "simplegen"
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type GeneratorFunc ¶
type GeneratorFunc func( sg *SimpleGenerator, pkg *packages.Package, node *ast.TypeSpec, comment *ast.Comment, ) (templateData SpecData, imports []string, err error)
GeneratorFunc for generating template data from ast nodes. SimpleGenerator calls it with: sg -> SimpleGenerator instance (for useful methods, look into docs or examples to know how to use them). pkg -> packages.Package where magic comment was found. node -> ast.TypeSpec struct annotated with magic comment. comment -> ast.Comment magic comment itself.
type GeneratorName ¶
type GeneratorName string
type GeneratorsMap ¶
type GeneratorsMap map[GeneratorName]TemplateGenerator
GeneratorsMap cmd_name -> func_to_generate_template_data
{ "paginator": GeneratePaginatorData, "sorter": GenerateSorterData, }
type PackageNames ¶
type PackageNames []string
PackageNames is a helper for flag.Parse Example: flag.Var(&pn, "package", "Package where simplegen should find magic comments").
func (*PackageNames) Set ¶
func (pn *PackageNames) Set(value string) error
func (PackageNames) String ¶
func (pn PackageNames) String() string
type SimpleGenerator ¶
type SimpleGenerator struct {
// contains filtered or unexported fields
}
func NewSimpleGenerator ¶
func NewSimpleGenerator(pkgNames PackageNames, generators GeneratorsMap, tmplFuncMap template.FuncMap) (*SimpleGenerator, error)
func (*SimpleGenerator) Generate ¶
func (sg *SimpleGenerator) Generate() error
func (*SimpleGenerator) GetObject ¶
GetObject tries to find type object in given package. In most cases you don't need it, use GetStructType instead.
func (*SimpleGenerator) GetPackage ¶
func (sg *SimpleGenerator) GetPackage(path string) (*packages.Package, error)
GetPackage returns packages.Package. It tries to load package if it didn't load before.
func (*SimpleGenerator) GetStructType ¶
func (sg *SimpleGenerator) GetStructType(pkg *packages.Package, typeName string) (*types.Struct, error)
GetStructType tries to find type struct in given package.
type TemplateGenerator ¶
type TemplateGenerator struct { // Template is a string which contains full template in go style Template string GeneratorFunc GeneratorFunc }
TemplateGenerator contains raw template and GeneratorFunc to generate template data.