initial import
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
commit
2c001628ff
8
go.mod
Normal file
8
go.mod
Normal file
@ -0,0 +1,8 @@
|
||||
module github.com/unistack-org/protoc-gen-micro2
|
||||
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
|
||||
google.golang.org/protobuf v1.25.0
|
||||
)
|
66
go.sum
Normal file
66
go.sum
Normal file
@ -0,0 +1,66 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
39
http.go
Normal file
39
http.go
Normal file
@ -0,0 +1,39 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
)
|
||||
|
||||
func (g *Generator) httpGenerate(component string, plugin *protogen.Plugin) error {
|
||||
for _, file := range plugin.Files {
|
||||
|
||||
if !file.Generate {
|
||||
continue
|
||||
}
|
||||
|
||||
// 1. Initialise a buffer to hold the generated code
|
||||
var buf bytes.Buffer
|
||||
|
||||
// 2. Write the package name
|
||||
pkg := fmt.Sprintf("package %s", file.GoPackageName)
|
||||
buf.Write([]byte(pkg))
|
||||
|
||||
// 3. For each message add our Foo() method
|
||||
for _, msg := range file.Proto.MessageType {
|
||||
buf.Write([]byte(fmt.Sprintf(`func (x %s) Foo() string {
|
||||
return "bar"}`, *msg.Name)))
|
||||
}
|
||||
|
||||
// 4. Specify the output filename, in this case test.foo.go
|
||||
filename := file.GeneratedFilenamePrefix + ".foo.go"
|
||||
file := plugin.NewGeneratedFile(filename, ".")
|
||||
|
||||
// 5. Pass the data from our buffer to the plugin file struct
|
||||
file.Write(buf.Bytes())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
66
main.go
Normal file
66
main.go
Normal file
@ -0,0 +1,66 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var flags flag.FlagSet
|
||||
|
||||
flagDebug := flags.Bool("debug", false, "")
|
||||
flagComponents := flags.String("components", "micro", "")
|
||||
flagPaths := flag.String("paths", "", "")
|
||||
flagModule := flag.String("module", "", "")
|
||||
|
||||
opts := &protogen.Options{
|
||||
ParamFunc: flags.Set,
|
||||
}
|
||||
|
||||
g := &Generator{
|
||||
debug: *flagDebug,
|
||||
components: strings.Split(*flagComponents, "|"),
|
||||
paths: *flagPaths,
|
||||
module: *flagModule,
|
||||
}
|
||||
|
||||
opts.Run(g.Generate)
|
||||
}
|
||||
|
||||
type Generator struct {
|
||||
debug bool
|
||||
components []string
|
||||
paths string
|
||||
module string
|
||||
}
|
||||
|
||||
func (g *Generator) Generate(plugin *protogen.Plugin) error {
|
||||
var err error
|
||||
|
||||
// Protoc passes a slice of File structs for us to process
|
||||
for _, component := range g.components {
|
||||
switch component {
|
||||
case "micro":
|
||||
err = g.microGenerate(component, plugin)
|
||||
case "http":
|
||||
err = g.httpGenerate(component, plugin)
|
||||
case "grpc", "rpc":
|
||||
err = g.rpcGenerate(component, plugin)
|
||||
case "openapi", "swagger":
|
||||
err = g.openapiGenerate(component, plugin)
|
||||
default:
|
||||
err = fmt.Errorf("unknown component: %s", component)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
plugin.Error(err)
|
||||
return err
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
134
micro.go
Normal file
134
micro.go
Normal file
@ -0,0 +1,134 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
api_options "google.golang.org/genproto/googleapis/api/annotations"
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func (g *Generator) microGenerate(component string, plugin *protogen.Plugin) error {
|
||||
for _, file := range plugin.Files {
|
||||
|
||||
if !file.Generate {
|
||||
continue
|
||||
}
|
||||
|
||||
gname := file.GeneratedFilenamePrefix + "_" + component + ".pb.go"
|
||||
gfile := plugin.NewGeneratedFile(gname, ".")
|
||||
|
||||
gfile.P("// Code generated by protoc-gen-micro")
|
||||
gfile.P("// source: ", *file.Proto.Name)
|
||||
gfile.P("package ", file.GoPackageName)
|
||||
|
||||
gfile.QualifiedGoIdent(protogen.GoIdent{"context", "context"})
|
||||
gfile.QualifiedGoIdent(protogen.GoIdent{"api", "github.com/unistack-org/micro/v3/api"})
|
||||
gfile.QualifiedGoIdent(protogen.GoIdent{"client", "github.com/unistack-org/micro/v3/client"})
|
||||
gfile.QualifiedGoIdent(protogen.GoIdent{"server", "github.com/unistack-org/micro/v3/server"})
|
||||
|
||||
gfile.P("// Reference imports to suppress errors if they are not otherwise used.")
|
||||
gfile.P("var (")
|
||||
gfile.P("_ ", "api.Endpoint")
|
||||
gfile.P("_ ", "context.Context")
|
||||
gfile.P(" _ ", "client.Option")
|
||||
gfile.P(" _ ", "server.Option")
|
||||
gfile.P(")")
|
||||
gfile.P()
|
||||
|
||||
// generate services
|
||||
for _, service := range file.Services {
|
||||
generateService(gfile, service)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateService(gfile *protogen.GeneratedFile, service *protogen.Service) {
|
||||
serviceName := strings.TrimSuffix(service.GoName, "Service")
|
||||
gfile.P("//New", serviceName, "Endpoints provides api endpoints metdata for ", serviceName, " service")
|
||||
gfile.P("func New", serviceName, "Endpoints() []*api.Endpoint {")
|
||||
gfile.P("return []*", "api.Endpoint{")
|
||||
for _, method := range service.Methods {
|
||||
if method.Desc.Options() == nil {
|
||||
continue
|
||||
}
|
||||
if proto.HasExtension(method.Desc.Options(), api_options.E_Http) {
|
||||
endpoints, streaming := generateEndpoints(method)
|
||||
for _, endpoint := range endpoints {
|
||||
gfile.P("&", "api.Endpoint{")
|
||||
generateEndpoint(gfile, serviceName, method.GoName, endpoint, streaming)
|
||||
gfile.P("},")
|
||||
}
|
||||
}
|
||||
}
|
||||
gfile.P("}")
|
||||
gfile.P("}")
|
||||
gfile.P()
|
||||
}
|
||||
|
||||
func generateEndpoints(method *protogen.Method) ([]*api_options.HttpRule, bool) {
|
||||
if method.Desc.Options() == nil {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
if !proto.HasExtension(method.Desc.Options(), api_options.E_Http) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
r := proto.GetExtension(method.Desc.Options(), api_options.E_Http)
|
||||
if r == nil {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
rule := r.(*api_options.HttpRule)
|
||||
rules := []*api_options.HttpRule{rule}
|
||||
rules = append(rules, rule.GetAdditionalBindings()...)
|
||||
|
||||
return rules, method.Desc.IsStreamingServer() || method.Desc.IsStreamingClient()
|
||||
}
|
||||
|
||||
func generateEndpoint(gfile *protogen.GeneratedFile, serviceName string, methodName string, rule *api_options.HttpRule, streaming bool) {
|
||||
var meth string
|
||||
var path string
|
||||
switch {
|
||||
case len(rule.GetDelete()) > 0:
|
||||
meth = "DELETE"
|
||||
path = rule.GetDelete()
|
||||
case len(rule.GetGet()) > 0:
|
||||
meth = "GET"
|
||||
path = rule.GetGet()
|
||||
case len(rule.GetPatch()) > 0:
|
||||
meth = "PATCH"
|
||||
path = rule.GetPatch()
|
||||
case len(rule.GetPost()) > 0:
|
||||
meth = "POST"
|
||||
path = rule.GetPost()
|
||||
case len(rule.GetPut()) > 0:
|
||||
meth = "PUT"
|
||||
path = rule.GetPut()
|
||||
case rule.GetCustom() != nil:
|
||||
crule := rule.GetCustom()
|
||||
meth = crule.Kind
|
||||
path = crule.Path
|
||||
}
|
||||
if len(meth) == 0 || len(path) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
gfile.P("Name:", fmt.Sprintf(`"%s.%s",`, serviceName, methodName))
|
||||
gfile.P("Path:", fmt.Sprintf(`[]string{"%s"},`, path))
|
||||
gfile.P("Method:", fmt.Sprintf(`[]string{"%s"},`, meth))
|
||||
if len(rule.GetGet()) == 0 {
|
||||
gfile.P("Body:", fmt.Sprintf(`"%s",`, rule.GetBody()))
|
||||
}
|
||||
if streaming {
|
||||
gfile.P("Stream: true,")
|
||||
}
|
||||
gfile.P(`Handler: "rpc",`)
|
||||
|
||||
return
|
||||
}
|
39
openapi.go
Normal file
39
openapi.go
Normal file
@ -0,0 +1,39 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
)
|
||||
|
||||
func (g *Generator) openapiGenerate(component string, plugin *protogen.Plugin) error {
|
||||
for _, file := range plugin.Files {
|
||||
|
||||
if !file.Generate {
|
||||
continue
|
||||
}
|
||||
|
||||
// 1. Initialise a buffer to hold the generated code
|
||||
var buf bytes.Buffer
|
||||
|
||||
// 2. Write the package name
|
||||
pkg := fmt.Sprintf("package %s", file.GoPackageName)
|
||||
buf.Write([]byte(pkg))
|
||||
|
||||
// 3. For each message add our Foo() method
|
||||
for _, msg := range file.Proto.MessageType {
|
||||
buf.Write([]byte(fmt.Sprintf(`func (x %s) Foo() string {
|
||||
return "bar"}`, *msg.Name)))
|
||||
}
|
||||
|
||||
// 4. Specify the output filename, in this case test.foo.go
|
||||
filename := file.GeneratedFilenamePrefix + ".foo.go"
|
||||
file := plugin.NewGeneratedFile(filename, ".")
|
||||
|
||||
// 5. Pass the data from our buffer to the plugin file struct
|
||||
file.Write(buf.Bytes())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
39
rpc.go
Normal file
39
rpc.go
Normal file
@ -0,0 +1,39 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
)
|
||||
|
||||
func (g *Generator) rpcGenerate(component string, plugin *protogen.Plugin) error {
|
||||
for _, file := range plugin.Files {
|
||||
|
||||
if !file.Generate {
|
||||
continue
|
||||
}
|
||||
|
||||
// 1. Initialise a buffer to hold the generated code
|
||||
var buf bytes.Buffer
|
||||
|
||||
// 2. Write the package name
|
||||
pkg := fmt.Sprintf("package %s", file.GoPackageName)
|
||||
buf.Write([]byte(pkg))
|
||||
|
||||
// 3. For each message add our Foo() method
|
||||
for _, msg := range file.Proto.MessageType {
|
||||
buf.Write([]byte(fmt.Sprintf(`func (x %s) Foo() string {
|
||||
return "bar"}`, *msg.Name)))
|
||||
}
|
||||
|
||||
// 4. Specify the output filename, in this case test.foo.go
|
||||
filename := file.GeneratedFilenamePrefix + ".foo.go"
|
||||
file := plugin.NewGeneratedFile(filename, ".")
|
||||
|
||||
// 5. Pass the data from our buffer to the plugin file struct
|
||||
file.Write(buf.Bytes())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user