Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ This repository is a Go utility library module: `github.com/pubgo/funk/v2`.
- [env](./env/README.md)
- [stack](./stack/README.md)
- [connmux](./connmux/README.md)
- [cloudevent](./component/cloudevent/README.md)

## Working rules for AI coding agents

Expand Down
87 changes: 40 additions & 47 deletions cmds/protoc-gen-go-cloudevent2/internal/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,22 @@ import (
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"

"github.com/pubgo/funk/v2"
"github.com/pubgo/funk/v2/assert"
"github.com/pubgo/funk/v2/component/cloudevent"
cloudeventpb "github.com/pubgo/funk/v2/proto/cloudevent"
cloudeventoptionpb "github.com/pubgo/funk/v2/proto/cloudeventoption"
"github.com/pubgo/funk/v2/result"
"github.com/pubgo/funk/v2/stack"
)

var (
cloudeventPkg = reflect.TypeOf(cloudevent.Client{}).PkgPath()
jobTypesPkg = reflect.TypeOf(cloudeventpb.PushEventOptions{}).PkgPath()
ctxPkg = stack.CallerWithFunc(context.WithTimeout).Pkg
assertPkt = stack.CallerWithFunc(assert.Assert).Pkg
protojsonPkt = stack.CallerWithFunc(protojson.Marshal).Pkg
cloudeventPkg = reflect.TypeOf(cloudevent.Client{}).PkgPath()
resultTypesPkg = stack.CallerWithFunc(result.Recovery).Pkg
ctxPkg = stack.CallerWithFunc(context.WithTimeout).Pkg
assertPkt = stack.CallerWithFunc(assert.Assert).Pkg
protojsonPkt = stack.CallerWithFunc(protojson.Marshal).Pkg
funkPkg = stack.CallerWithFunc(funk.IsNil).Pkg
)

type eventInfo struct {
Expand All @@ -40,7 +44,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
filename := file.GeneratedFilenamePrefix + ".cloudevent.pb.go"
genFile := jen.NewFile(string(file.GoPackageName))
genFile.HeaderComment("Code generated by protoc-gen-go-cloudevent. DO NOT EDIT.")
genFile.HeaderComment("versions:")
genFile.HeaderComment("Versions:")
genFile.HeaderComment(fmt.Sprintf(" - protoc-gen-go-cloudevent %s", Version))
genFile.HeaderComment(fmt.Sprintf(" - protoc %s", protocVersion(gen)))
if file.Proto.GetOptions().GetDeprecated() {
Expand All @@ -58,7 +62,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated

events := make(map[string]map[string]*eventInfo)
for _, srv := range file.Services {
job, ok := proto.GetExtension(srv.Desc.Options(), cloudeventpb.E_Job).(*cloudeventpb.CloudEventServiceOptions)
job, ok := proto.GetExtension(srv.Desc.Options(), cloudeventoptionpb.E_Job).(*cloudeventpb.CloudEventServiceOptions)
if !ok || job == nil {
continue
}
Expand All @@ -70,7 +74,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
}

for _, m := range srv.Methods {
jobSubject, ok := proto.GetExtension(m.Desc.Options(), cloudeventpb.E_Subject).(*cloudeventpb.CloudEventMethodOptions)
jobSubject, ok := proto.GetExtension(m.Desc.Options(), cloudeventoptionpb.E_Subject).(*cloudeventpb.CloudEventMethodOptions)
if !ok || jobSubject == nil {
continue
}
Expand Down Expand Up @@ -109,7 +113,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
srvInfo := getSrv(subjects)
jobKeyPrefix := strings.ReplaceAll(srvInfo.GoName, "InnerService", "")
jobKeyPrefix = strings.ReplaceAll(jobKeyPrefix, "Inner", "")
jobKeyName := fmt.Sprintf("%sCloudEventKey", jobKeyPrefix)
jobKeyName := fmt.Sprintf("%sCloudEventJobKey", jobKeyPrefix)
genFile.Const().
Id(jobKeyName).
Op("=").
Expand All @@ -120,7 +124,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated

for _, subName := range subjectNames {
info := subjects[subName]
keyName := fmt.Sprintf("%sCloudEventKey", info.mth.GoName)
keyName := fmt.Sprintf("%sCloudEventSubjectKey", info.mth.GoName)
genFile.Commentf("%s /%s/%s", keyName, info.srv.Desc.FullName(), info.mth.GoName)
genFile.Comment(strings.TrimSpace(info.mth.Comments.Leading.String()))
genFile.Const().
Expand All @@ -129,25 +133,6 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
Lit(subName)
}

//for _, subName := range subjectNames {
// //info := subjects[subName]
// //var dd = string(assert.Must1(protojson.Marshal(info.subject)))
// //var keyName = fmt.Sprintf("%sCloudEventKey", info.mth.GoName)
// //genFile.Var().Id("_").Op("=").
// // Qual(cloudeventPkg, "RegisterSubject").
// // Call(
// // jen.Id(keyName),
// // jen.Lit(fmt.Sprintf("/%s/%s", info.srv.Desc.FullName(), info.mth.GoName)),
// // jen.Func().Params().Params(jen.Op("*").Qual(jobTypesPkg, "CloudEventSubject")).
// // BlockFunc(func(group *jen.Group) {
// // group.Var().Id("data=[]byte").Call(jen.Lit(fmt.Sprintf(`%s`, dd)))
// // group.Var().Id("p").Qual(jobTypesPkg, "CloudEventSubject")
// // group.Qual(assertPkt, "Must").Call(jen.Qual(protojsonPkt, "Unmarshal").Call(jen.Id("data, &p")))
// // group.Return().Id("&p")
// // }).Call(),
// // ).Line()
//}

subjectValues := lo.Values(subjects)
cloudEventName := fmt.Sprintf("%sCloudEvent", subjectValues[0].srv.GoName)
genFile.Type().Id(cloudEventName).StructFunc(func(group *jen.Group) {
Expand All @@ -164,17 +149,16 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
Params(
jen.Id("jobCli").Op("*").Qual(cloudeventPkg, "Client"),
jen.Id("event").Id(cloudEventName),
jen.Id("opts").Op("...").Op("*").Qual(jobTypesPkg, "RegisterJobOptions"),
jen.Id("opts").Op("...").Qual(cloudeventPkg, "RegisterOpt"),
).BlockFunc(func(group *jen.Group) {
for _, ss := range subjectValues {
keyName := fmt.Sprintf("%sCloudEventKey", ss.mth.GoName)
keyName := fmt.Sprintf("%sCloudEventSubjectKey", ss.mth.GoName)
group.If(jen.Id("event").Dot("On" + ss.mth.GoName)).Op("!=").Nil().BlockFunc(func(group *jen.Group) {
group.Qual(cloudeventPkg, "RegisterJobHandler").Call(
jen.Id("jobCli"),
jen.Id(jobKeyName),
jen.Id(keyName),
jen.Id("event").Dot("On"+ss.mth.GoName),
// jen.Qual(cloudeventPkg, "WrapHandler").Call(jen.Id("event").Dot(ss.mth.GoName)),
jen.Id("opts").Op("..."),
)
}).Line()
Expand All @@ -184,37 +168,46 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.Generated
publisher := fmt.Sprintf("%sPublisher", cloudEventName)
genFile.Type().Id(publisher).StructFunc(func(group *jen.Group) {
group.Id("Client").Op("*").Qual(cloudeventPkg, "Client")
group.Id("Opt").Qual(cloudeventPkg, "PubOpt")
group.Id("Interceptors").Op("[]").Qual(cloudeventPkg, "PubInterceptor")
})
for _, ss := range subjectValues {
mthName := fmt.Sprintf("Push%sEvent", ss.mth.GoName)
keyName := fmt.Sprintf("%sCloudEventKey", ss.mth.GoName)
mthName := handlerPushEventName(ss.mth.GoName)
keyName := fmt.Sprintf("%sCloudEventSubjectKey", ss.mth.GoName)
genFile.Func().
Params(jen.Id(fmt.Sprintf("a %s", publisher))).
Id(mthName).
Params(
jen.Id("ctx").Qual("context", "Context"),
jen.Id("req").Op("*").Id(ss.mth.Input.GoIdent.GoName),
jen.Id("opts").Op("...").Op("*").Qual(jobTypesPkg, "PushEventOptions"),
jen.Id("req").Op("*").Add(getPkg(file, ss.mth.Input.GoIdent)),
jen.Id("opts").Op("...").Qual(cloudeventPkg, "PubOpt"),
).
Params(jen.Op("*").Qual(cloudeventPkg, "PubAckInfo"), jen.Error()).
Block(jen.Return().Id("a.Client").Dot("Publish").Call(
jen.Id("ctx"),
jen.Id(keyName),
jen.Id("req"),
jen.Id("opts").Op("..."),
))
Params(jen.Qual(resultTypesPkg, "Result").Id("[").Op("*").Qual(cloudeventPkg, "PubAckInfo").Id("]")).
BlockFunc(func(group *jen.Group) {
group.Return().Id("a.Client.Publish").Call(
jen.Id("ctx"),
jen.Id(keyName),
jen.Id("req"),
jen.Id("a.Interceptors"),
jen.Qual(funkPkg, "AppendOf").Call(jen.Id("a.Opt"), jen.Id("opts").Op("...")).Op("..."),
)
})
}
}

g.P(genFile.GoString())
return g
}

func handlerPushEventName(name string, prefix string) string {
if strings.HasPrefix(name, prefix) {
return name
func handlerPushEventName(name string) string {
if !strings.HasPrefix(name, "Push") {
name = fmt.Sprintf("Push%s", name)
}

if !strings.HasSuffix(name, "Event") {
name = fmt.Sprintf("%sEvent", name)
}
return fmt.Sprintf("%s%s", prefix, name)
return name
}

func getSrv(data map[string]*eventInfo) *protogen.Service {
Expand Down
2 changes: 1 addition & 1 deletion cmds/protoc-gen-go-cloudevent2/internal/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"google.golang.org/protobuf/compiler/protogen"
)

const Version = "v0.0.4"
const Version = "v0.0.5"

func protocVersion(gen *protogen.Plugin) string {
v := gen.Request.GetCompilerVersion()
Expand Down
Loading
Loading