v2/codegen/infragen/pubsubgen/pubsubgen.go
Rama main · réplica de lectura del repositorio original.
package pubsubgen
import (
"strings"
. "github.com/dave/jennifer/jen"
"encr.dev/v2/app"
"encr.dev/v2/codegen"
"encr.dev/v2/internals/pkginfo"
"encr.dev/v2/parser/infra/pubsub"
"encr.dev/v2/parser/resource"
)
func Gen(gen *codegen.Generator, pkg *pkginfo.Package, appDesc *app.Desc, subs []*pubsub.Subscription) {
var file *codegen.File // created on first use
for _, sub := range subs {
if method, ok := sub.MethodHandler.Get(); ok {
if file == nil {
file = gen.File(pkg, "pubsub")
}
rewriteMethodHandler(gen, file, appDesc, sub, method)
}
}
}
func rewriteMethodHandler(gen *codegen.Generator, f *codegen.File, appDesc *app.Desc, sub *pubsub.Subscription, method pubsub.MethodHandler) {
res, ok := appDesc.Parse.ResourceForQN(sub.Topic).Get()
if !ok || res.Kind() != resource.PubSubTopic {
gen.Errs.Add(
pubsub.ErrSubscriptionTopicNotResource.AtGoNode(sub.AST.Args[0]),
)
return
}
topic := res.(*pubsub.Topic)
svc, ok := appDesc.ServiceForPath(sub.File.FSPath)
if !ok {
gen.Errs.Add(
pubsub.ErrInvalidMethodHandler.AtGoNode(sub.Handler),
)
return
}
handler := f.FuncDecl("handler", strings.ReplaceAll(sub.Name, "-", "_"))
handler.Params(Id("ctx").Qual("context", "Context"), Id("msg").Add(gen.Util.Type(topic.MessageType.ToType())))
handler.Results(Error())
handler.BodyFunc(func(g *Group) {
// svc, err := service.Get[*SvcStruct]()
g.List(Id("svc"), Err()).Op(":=").Qual("encore.dev/appruntime/apisdk/service", "Get").Types(
Op("*").Id(method.Decl.Name),
).Call(Lit(svc.Name))
// if err != nil { return err }
g.If(Err().Op("!=").Nil()).Block(
Return(Err()),
)
// return svc.Method(ctx, msg)
g.Return(Id("svc").Dot(method.Method).Call(Id("ctx"), Id("msg")))
})
gen.Rewrite(sub.File).Replace(sub.Handler.Pos(), sub.Handler.End(), []byte(handler.Name()))
}