Ctrl K
ComunidadGuías…

v2/codegen/infragen/pubsubgen/pubsubgen.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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()))
}