Rewrite generator and update for Lemmy 0.18.3
This commit is contained in:
		@@ -5,7 +5,7 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/dave/jennifer/jen"
 | 
			
		||||
	"go.elara.ws/go-lemmy/cmd/gen/parser"
 | 
			
		||||
	"go.elara.ws/go-lemmy/cmd/gen/extractor"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type RoutesGenerator struct {
 | 
			
		||||
@@ -17,23 +17,30 @@ func NewRoutes(w io.Writer, pkgName string) *RoutesGenerator {
 | 
			
		||||
	return &RoutesGenerator{w, pkgName}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *RoutesGenerator) Generate(routes []parser.Route, impls map[string]string) error {
 | 
			
		||||
func (r *RoutesGenerator) Generate(routes []extractor.Route) error {
 | 
			
		||||
	f := jen.NewFile(r.PkgName)
 | 
			
		||||
	f.HeaderComment("Code generated by go.elara.ws/go-lemmy/cmd/gen (routes generator). DO NOT EDIT.")
 | 
			
		||||
 | 
			
		||||
	for _, r := range routes {
 | 
			
		||||
		resStruct := impls[r.Struct]
 | 
			
		||||
 | 
			
		||||
		f.Comment(r.Summary)
 | 
			
		||||
		f.Func().Params(
 | 
			
		||||
			jen.Id("c").Id("*Client"),
 | 
			
		||||
		).Id(transformName(r.Struct)).Params(
 | 
			
		||||
		).Id(transformName(r.Name)).Params(
 | 
			
		||||
			jen.Id("ctx").Qual("context", "Context"),
 | 
			
		||||
			jen.Id("data").Qual("go.elara.ws/go-lemmy/types", r.Struct),
 | 
			
		||||
		).Params(
 | 
			
		||||
			jen.Op("*").Qual("go.elara.ws/go-lemmy/types", resStruct),
 | 
			
		||||
			jen.Error(),
 | 
			
		||||
		).BlockFunc(func(g *jen.Group) {
 | 
			
		||||
			g.Id("resData").Op(":=").Op("&").Qual("go.elara.ws/go-lemmy/types", resStruct).Block()
 | 
			
		||||
			jen.Id("data").Qual("go.elara.ws/go-lemmy/types", r.ParamsName),
 | 
			
		||||
		).ParamsFunc(func(g *jen.Group) {
 | 
			
		||||
			if r.ReturnName != "" {
 | 
			
		||||
				g.Op("*").Qual("go.elara.ws/go-lemmy/types", r.ReturnName)
 | 
			
		||||
			}
 | 
			
		||||
			g.Error()
 | 
			
		||||
		}).BlockFunc(func(g *jen.Group) {
 | 
			
		||||
			returnName := r.ReturnName
 | 
			
		||||
			if returnName == "" {
 | 
			
		||||
				returnName = "EmptyResponse"
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			g.Id("resData").Op(":=").Op("&").Qual("go.elara.ws/go-lemmy/types", returnName).Block()
 | 
			
		||||
 | 
			
		||||
			var funcName string
 | 
			
		||||
			switch r.Method {
 | 
			
		||||
@@ -46,16 +53,28 @@ func (r *RoutesGenerator) Generate(routes []parser.Route, impls map[string]strin
 | 
			
		||||
			g.List(jen.Id("res"), jen.Err()).Op(":=").Id("c").Dot(funcName).Params(
 | 
			
		||||
				jen.Id("ctx"), jen.Lit(r.Method), jen.Lit(r.Path), jen.Id("data"), jen.Op("&").Id("resData"),
 | 
			
		||||
			)
 | 
			
		||||
			g.If(jen.Err().Op("!=").Nil()).Block(
 | 
			
		||||
				jen.Return(jen.Nil(), jen.Err()),
 | 
			
		||||
			)
 | 
			
		||||
			g.If(jen.Err().Op("!=").Nil()).BlockFunc(func(g *jen.Group) {
 | 
			
		||||
				if returnName == "EmptyResponse" {
 | 
			
		||||
					g.Return(jen.Err())
 | 
			
		||||
				} else {
 | 
			
		||||
					g.Return(jen.Nil(), jen.Err())
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			g.Err().Op("=").Id("resError").Params(jen.Id("res"), jen.Id("resData").Dot("LemmyResponse"))
 | 
			
		||||
			g.If(jen.Err().Op("!=").Nil()).Block(
 | 
			
		||||
				jen.Return(jen.Nil(), jen.Err()),
 | 
			
		||||
			)
 | 
			
		||||
			g.If(jen.Err().Op("!=").Nil()).BlockFunc(func(g *jen.Group) {
 | 
			
		||||
				if returnName == "EmptyResponse" {
 | 
			
		||||
					g.Return(jen.Err())
 | 
			
		||||
				} else {
 | 
			
		||||
					g.Return(jen.Nil(), jen.Err())
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			g.Return(jen.Id("resData"), jen.Nil())
 | 
			
		||||
			if returnName == "EmptyResponse" {
 | 
			
		||||
				g.Return(jen.Nil())
 | 
			
		||||
			} else {
 | 
			
		||||
				g.Return(jen.Id("resData"), jen.Nil())
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -63,6 +82,7 @@ func (r *RoutesGenerator) Generate(routes []parser.Route, impls map[string]strin
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func transformName(s string) string {
 | 
			
		||||
	s = strings.ToUpper(s[:1]) + s[1:]
 | 
			
		||||
	s = strings.TrimPrefix(s, "Get")
 | 
			
		||||
	s = strings.TrimPrefix(s, "List")
 | 
			
		||||
	return s
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,10 @@ package generator
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode"
 | 
			
		||||
 | 
			
		||||
	"github.com/dave/jennifer/jen"
 | 
			
		||||
	"go.elara.ws/go-lemmy/cmd/gen/parser"
 | 
			
		||||
	"go.elara.ws/go-lemmy/cmd/gen/extractor"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type StructGenerator struct {
 | 
			
		||||
@@ -17,36 +18,88 @@ func NewStruct(w io.Writer, pkgName string) *StructGenerator {
 | 
			
		||||
	return &StructGenerator{w, pkgName}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *StructGenerator) Generate(items []parser.Item) error {
 | 
			
		||||
func (s *StructGenerator) Generate(items []extractor.Struct) error {
 | 
			
		||||
	f := jen.NewFile(s.PkgName)
 | 
			
		||||
	f.HeaderComment("Code generated by go.elara.ws/go-lemmy/cmd/gen (struct generator). DO NOT EDIT.")
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	for _, item := range items {
 | 
			
		||||
		if item.Struct != nil {
 | 
			
		||||
			st := item.Struct
 | 
			
		||||
			f.Type().Id(st.Name).StructFunc(func(g *jen.Group) {
 | 
			
		||||
				for _, field := range st.Fields {
 | 
			
		||||
					g.Id(field.Name).Id(field.Type).Tag(map[string]string{
 | 
			
		||||
						"json": field.OrigName,
 | 
			
		||||
						"url":  field.OrigName + ",omitempty",
 | 
			
		||||
		if len(item.UnionNames) > 0 {
 | 
			
		||||
			f.Type().Id(item.Name).String()
 | 
			
		||||
 | 
			
		||||
			f.Const().DefsFunc(func(g *jen.Group) {
 | 
			
		||||
				for _, member := range item.UnionNames {
 | 
			
		||||
					constName := strings.Replace(item.Name+string(member), " ", "", -1)
 | 
			
		||||
					g.Id(constName).Id(item.Name).Op("=").Lit(string(member))
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		} else {
 | 
			
		||||
			f.Type().Id(item.Name).StructFunc(func(g *jen.Group) {
 | 
			
		||||
				for _, field := range item.Fields {
 | 
			
		||||
					g.Id(transformFieldName(field.Name)).Id(getType(field)).Tag(map[string]string{
 | 
			
		||||
						"json": field.Name,
 | 
			
		||||
						"url":  field.Name + ",omitempty",
 | 
			
		||||
					})
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if strings.HasSuffix(st.Name, "Response") {
 | 
			
		||||
				if strings.HasSuffix(item.Name, "Response") {
 | 
			
		||||
					g.Id("LemmyResponse")
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		} else if item.Enum != nil {
 | 
			
		||||
			e := item.Enum
 | 
			
		||||
			f.Type().Id(e.Name).String()
 | 
			
		||||
 | 
			
		||||
			f.Const().DefsFunc(func(g *jen.Group) {
 | 
			
		||||
				for _, member := range e.Members {
 | 
			
		||||
					g.Id(e.Name + string(member)).Id(e.Name).Op("=").Lit(string(member))
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return f.Render(s.w)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getType(f extractor.Field) string {
 | 
			
		||||
	t := transformType(f.Type)
 | 
			
		||||
	if f.IsArray {
 | 
			
		||||
		t = "[]" + t
 | 
			
		||||
	}
 | 
			
		||||
	if f.IsOptional {
 | 
			
		||||
		t = "Optional[" + t + "]"
 | 
			
		||||
	}
 | 
			
		||||
	return t
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func transformType(s string) string {
 | 
			
		||||
	switch s {
 | 
			
		||||
	case "number":
 | 
			
		||||
		return "float64"
 | 
			
		||||
	case "boolean":
 | 
			
		||||
		return "bool"
 | 
			
		||||
	default:
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func transformFieldName(s string) string {
 | 
			
		||||
	s = snakeToCamel(s)
 | 
			
		||||
	s = strings.NewReplacer(
 | 
			
		||||
		"Id", "ID",
 | 
			
		||||
		"Url", "URL",
 | 
			
		||||
		"Nsfw", "NSFW",
 | 
			
		||||
		"Jwt", "JWT",
 | 
			
		||||
		"Crud", "CRUD",
 | 
			
		||||
	).Replace(s)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func snakeToCamel(s string) string {
 | 
			
		||||
	sb := &strings.Builder{}
 | 
			
		||||
	capitalizeNext := true
 | 
			
		||||
	for _, char := range s {
 | 
			
		||||
		if char == '_' {
 | 
			
		||||
			capitalizeNext = true
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if capitalizeNext {
 | 
			
		||||
			sb.WriteRune(unicode.ToUpper(char))
 | 
			
		||||
			capitalizeNext = false
 | 
			
		||||
		} else {
 | 
			
		||||
			sb.WriteRune(char)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return sb.String()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user