package generator import ( "io" "strings" "github.com/dave/jennifer/jen" "go.elara.ws/go-lemmy/cmd/gen/extractor" ) type RoutesGenerator struct { w io.Writer PkgName string } func NewRoutes(w io.Writer, pkgName string) *RoutesGenerator { return &RoutesGenerator{w, pkgName} } 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 { f.Comment(r.Summary) f.Func().Params( jen.Id("c").Id("*Client"), ).Id(transformName(r.Name)).ParamsFunc(func(g *jen.Group) { g.Id("ctx").Qual("context", "Context") if r.ParamsName != "" { g.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" } if r.ParamsName == "" { g.Id("data").Op(":=").Qual("go.elara.ws/go-lemmy/types", "EmptyData").Block() } g.Id("resData").Op(":=").Op("&").Qual("go.elara.ws/go-lemmy/types", returnName).Block() var funcName string switch r.Method { case "GET": funcName = "getReq" default: funcName = "req" } 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()).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()).BlockFunc(func(g *jen.Group) { if returnName == "EmptyResponse" { g.Return(jen.Err()) } else { g.Return(jen.Nil(), jen.Err()) } }) if returnName == "EmptyResponse" { g.Return(jen.Nil()) } else { g.Return(jen.Id("resData"), jen.Nil()) } }) } return f.Render(r.w) } func transformName(s string) string { s = strings.ToUpper(s[:1]) + s[1:] s = strings.TrimPrefix(s, "Get") s = strings.TrimPrefix(s, "List") return s }