1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package gogen
- import (
- "fmt"
- "io"
- "os"
- "path"
- "strings"
- "git.i2edu.net/i2/go-zero/tools/goctl/api/spec"
- apiutil "git.i2edu.net/i2/go-zero/tools/goctl/api/util"
- "git.i2edu.net/i2/go-zero/tools/goctl/config"
- "git.i2edu.net/i2/go-zero/tools/goctl/util"
- "git.i2edu.net/i2/go-zero/tools/goctl/util/format"
- )
- const (
- typesFile = "types"
- typesTemplate = `// Code generated by goctl. DO NOT EDIT.
- package types{{if .containsTime}}
- import (
- "time"
- ){{end}}
- {{.types}}
- `
- )
- // BuildTypes gen types to string
- func BuildTypes(types []spec.Type) (string, error) {
- var builder strings.Builder
- first := true
- for _, tp := range types {
- if first {
- first = false
- } else {
- builder.WriteString("\n\n")
- }
- if err := writeType(&builder, tp); err != nil {
- return "", apiutil.WrapErr(err, "Type "+tp.Name()+" generate error")
- }
- }
- return builder.String(), nil
- }
- func genTypes(dir string, cfg *config.Config, api *spec.ApiSpec) error {
- val, err := BuildTypes(api.Types)
- if err != nil {
- return err
- }
- typeFilename, err := format.FileNamingFormat(cfg.NamingFormat, typesFile)
- if err != nil {
- return err
- }
- typeFilename = typeFilename + ".go"
- filename := path.Join(dir, typesDir, typeFilename)
- os.Remove(filename)
- return genFile(fileGenConfig{
- dir: dir,
- subdir: typesDir,
- filename: typeFilename,
- templateName: "typesTemplate",
- category: "",
- templateFile: "",
- builtinTemplate: typesTemplate,
- data: map[string]interface{}{
- "types": val,
- "containsTime": false,
- },
- })
- }
- func writeType(writer io.Writer, tp spec.Type) error {
- structType, ok := tp.(spec.DefineStruct)
- if !ok {
- return fmt.Errorf("unspport struct type: %s", tp.Name())
- }
- fmt.Fprintf(writer, "type %s struct {\n", util.Title(tp.Name()))
- for _, member := range structType.Members {
- if member.IsInline {
- if _, err := fmt.Fprintf(writer, "%s\n", strings.Title(member.Type.Name())); err != nil {
- return err
- }
- continue
- }
- if err := writeProperty(writer, member.Name, member.Tag, member.GetComment(), member.Type, 1); err != nil {
- return err
- }
- }
- fmt.Fprintf(writer, "}")
- return nil
- }
|