Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
f814b489db | |||
2ec1af2884 | |||
a63ea1ec4d | |||
74fecbec12 |
@@ -10,7 +10,7 @@ This project is a generator plugin for the Google Protocol Buffers compiler (`pr
|
||||
## Usage
|
||||
|
||||
```console
|
||||
$> protoc --micro_out=debug=true,components="micro|http":. input.proto
|
||||
$> protoc --go_micro_out=debug=true,components="micro|http":. input.proto
|
||||
```
|
||||
|
||||
| Option | Default Value | Accepted Values | Description
|
||||
@@ -22,5 +22,5 @@ $> protoc --micro_out=debug=true,components="micro|http":. input.proto
|
||||
## Install
|
||||
|
||||
* Install the **go** compiler and tools from https://golang.org/doc/install
|
||||
* Install **protoc-gen-go**: `go get google.golang.org/protobuf/cmd/protoc-gen-go`
|
||||
* Install **protoc-gen-go-micro**: `go get github.com/unistack-org/protoc-gen-go-micro/v3`
|
||||
* Install **protoc-gen-go**: `go install google.golang.org/protobuf/cmd/protoc-gen-go`
|
||||
* Install **protoc-gen-go-micro**: `go install go.unistack.org/protoc-gen-go-micro/v3`
|
||||
|
@@ -11,7 +11,7 @@ import "google/protobuf/wrappers.proto";
|
||||
|
||||
service Example {
|
||||
rpc Call(CallReq) returns (CallRsp) {
|
||||
option (micro.openapiv2.openapiv2_operation) = {
|
||||
option (micro.openapiv3.openapiv3_operation) = {
|
||||
operation_id: "Call";
|
||||
responses: {
|
||||
key: "default";
|
||||
|
4
go.mod
4
go.mod
@@ -1,13 +1,13 @@
|
||||
module github.com/unistack-org/protoc-gen-go-micro/v3
|
||||
module go.unistack.org/protoc-gen-go-micro/v3
|
||||
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/fatih/structtag v1.2.0
|
||||
github.com/unistack-org/micro-codec-jsonpb/v3 v3.7.5
|
||||
go.unistack.org/micro-proto/v3 v3.1.0
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
google.golang.org/protobuf v1.27.1
|
||||
)
|
||||
|
||||
//replace go.unistack.org/micro/v3 => ../micro
|
||||
//replace go.unistack.org/micro-proto => ../micro-proto
|
||||
|
19
go.sum
19
go.sum
@@ -1,32 +1,13 @@
|
||||
github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg=
|
||||
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
||||
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
||||
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||
github.com/silas/dag v0.0.0-20210121180416-41cf55125c34/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
|
||||
github.com/unistack-org/micro-codec-jsonpb/v3 v3.7.5 h1:pSiCUeBqZlSFkmkArmp1XEgXSWFSi1Ny4tdNnPV4xZE=
|
||||
github.com/unistack-org/micro-codec-jsonpb/v3 v3.7.5/go.mod h1:dNCg88s7bm0ekYR316IietEzrMcogKfMYt9P2VJ61FY=
|
||||
github.com/unistack-org/micro-proto v0.0.9 h1:KrWLS4FUX7UAWNAilQf70uad6ZPf/0EudeddCXllRVc=
|
||||
github.com/unistack-org/micro-proto v0.0.9/go.mod h1:Cckwmzd89gvS7ThxzZp9kQR/EOdksFQcsTAtDDyKwrg=
|
||||
github.com/unistack-org/micro/v3 v3.7.4 h1:nRk7f58v0VsiW7aKL0UQaFCQxFoursHQLoWdeZ1RYbg=
|
||||
github.com/unistack-org/micro/v3 v3.7.4/go.mod h1:78vy7ggElJD+ayx8ruhJsY+SkGUupfR32LXrg1UObvg=
|
||||
go.unistack.org/micro-proto/v3 v3.1.0 h1:q39FwjFiRZn+Ux/tt+d3bJTmDtsQQWa+3SLYVo1vLfA=
|
||||
go.unistack.org/micro-proto/v3 v3.1.0/go.mod h1:DpRhYCBXlmSJ/AAXTmntvlh7kQkYU6eFvlmYAx4BQS8=
|
||||
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
19
openapiv3.go
19
openapiv3.go
@@ -22,7 +22,6 @@ import (
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
jsonpbcodec "github.com/unistack-org/micro-codec-jsonpb/v3"
|
||||
annotations "go.unistack.org/micro-proto/v3/api"
|
||||
v3 "go.unistack.org/micro-proto/v3/openapiv3"
|
||||
"google.golang.org/protobuf/compiler/protogen"
|
||||
@@ -51,7 +50,7 @@ func (g *Generator) openapiv3Generate(component string, plugin *protogen.Plugin)
|
||||
|
||||
d := og.buildDocumentV3(plugin)
|
||||
|
||||
bytes, err := jsonpbcodec.NewCodec(jsonpbcodec.MarshalOptions(jsonpb.MarshalOptions{Indent: " "})).Marshal(d)
|
||||
bytes, err := (jsonpb.MarshalOptions{Indent: " "}).Marshal(d)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal: %s", err.Error())
|
||||
}
|
||||
@@ -223,6 +222,15 @@ func (g *openapiv3Generator) buildOperationV3(
|
||||
parameters = append(parameters, opt.Parameters...)
|
||||
}
|
||||
|
||||
sparameters := make(map[string]struct{})
|
||||
for _, paramOrRef := range parameters {
|
||||
parameter := paramOrRef.GetParameter()
|
||||
if parameter == nil {
|
||||
continue
|
||||
}
|
||||
sparameters[parameter.Name] = struct{}{}
|
||||
}
|
||||
|
||||
// Build a list of path parameters.
|
||||
pathParameters := make([]string, 0)
|
||||
if matches := g.namePattern.FindStringSubmatch(path); matches != nil {
|
||||
@@ -245,6 +253,10 @@ func (g *openapiv3Generator) buildOperationV3(
|
||||
}
|
||||
// Add the path parameters to the operation parameters.
|
||||
for _, pathParameter := range pathParameters {
|
||||
if _, ok := sparameters[pathParameter]; ok {
|
||||
continue
|
||||
}
|
||||
|
||||
parameters = append(parameters,
|
||||
&v3.ParameterOrReference{
|
||||
Oneof: &v3.ParameterOrReference_Parameter{
|
||||
@@ -269,6 +281,9 @@ func (g *openapiv3Generator) buildOperationV3(
|
||||
for _, field := range inputMessage.Fields {
|
||||
fieldName := string(field.Desc.Name())
|
||||
if !contains(coveredParameters, fieldName) {
|
||||
if _, ok := sparameters[fieldName]; ok {
|
||||
continue
|
||||
}
|
||||
// Get the field description from the comments.
|
||||
fieldDescription := g.filterCommentString(field.Comments.Leading)
|
||||
parameters = append(parameters,
|
||||
|
64
util.go
64
util.go
@@ -2,7 +2,6 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
@@ -92,13 +91,39 @@ func generateServiceClientMethods(gfile *protogen.GeneratedFile, service *protog
|
||||
gfile.P(")")
|
||||
}
|
||||
|
||||
parameters := make(map[string]map[string]string)
|
||||
// Build a list of header parameters.
|
||||
eopt := proto.GetExtension(method.Desc.Options(), v3.E_Openapiv3Operation)
|
||||
if eopt != nil && eopt != v3.E_Openapiv3Operation.InterfaceOf(v3.E_Openapiv3Operation.Zero()) {
|
||||
opt := eopt.(*v3.Operation)
|
||||
log.Printf("xxx %#+v\n", opt)
|
||||
for _, paramOrRef := range opt.Parameters {
|
||||
parameter := paramOrRef.GetParameter()
|
||||
if parameter == nil {
|
||||
continue
|
||||
}
|
||||
if parameter.In != "header" && parameter.In != "cookie" {
|
||||
continue
|
||||
}
|
||||
in, ok := parameters[parameter.In]
|
||||
if !ok {
|
||||
in = make(map[string]string)
|
||||
parameters[parameter.In] = in
|
||||
}
|
||||
in[parameter.Name] = fmt.Sprintf("%v", parameter.Required)
|
||||
}
|
||||
}
|
||||
|
||||
if len(parameters) > 0 {
|
||||
gfile.P("opts = append(opts,")
|
||||
for pk, pv := range parameters {
|
||||
params := make([]string, 0, len(pv)/2)
|
||||
for k, v := range pv {
|
||||
params = append(params, k, v)
|
||||
}
|
||||
gfile.P(microClientHttpPackage.Ident(strings.Title(pk)), `("`, strings.Join(params, `" ,"`), `"),`)
|
||||
}
|
||||
gfile.P(")")
|
||||
}
|
||||
}
|
||||
|
||||
if rule, ok := getMicroApiMethod(method); ok {
|
||||
@@ -221,6 +246,39 @@ func generateServiceServerMethods(gfile *protogen.GeneratedFile, service *protog
|
||||
gfile.P("return h.", serviceName, "Server.", method.GoName, "(ctx, &", unexport(serviceName), method.GoName, "Stream{stream})")
|
||||
}
|
||||
} else {
|
||||
parameters := make(map[string]map[string]string)
|
||||
// Build a list of header parameters.
|
||||
eopt := proto.GetExtension(method.Desc.Options(), v3.E_Openapiv3Operation)
|
||||
if eopt != nil && eopt != v3.E_Openapiv3Operation.InterfaceOf(v3.E_Openapiv3Operation.Zero()) {
|
||||
opt := eopt.(*v3.Operation)
|
||||
for _, paramOrRef := range opt.Parameters {
|
||||
parameter := paramOrRef.GetParameter()
|
||||
if parameter == nil {
|
||||
continue
|
||||
}
|
||||
if parameter.In != "header" && parameter.In != "cookie" {
|
||||
continue
|
||||
}
|
||||
in, ok := parameters[parameter.In]
|
||||
if !ok {
|
||||
in = make(map[string]string)
|
||||
parameters[parameter.In] = in
|
||||
}
|
||||
in[parameter.Name] = fmt.Sprintf("%v", parameter.Required)
|
||||
}
|
||||
}
|
||||
|
||||
if len(parameters) > 0 {
|
||||
gfile.P(microServerHttpPackage.Ident("FillRequest"), `(ctx, req, `)
|
||||
for pk, pv := range parameters {
|
||||
params := make([]string, 0, len(pv)/2)
|
||||
for k, v := range pv {
|
||||
params = append(params, k, v)
|
||||
}
|
||||
gfile.P(microServerHttpPackage.Ident(strings.Title(pk)), `("`, strings.Join(params, `" ,"`), `"),`)
|
||||
}
|
||||
gfile.P(")")
|
||||
}
|
||||
gfile.P("return h.", serviceName, "Server.", method.GoName, "(ctx, req, rsp)")
|
||||
}
|
||||
gfile.P("}")
|
||||
@@ -593,6 +651,4 @@ func generateEndpoint(gfile *protogen.GeneratedFile, serviceName string, methodN
|
||||
gfile.P("Stream: true,")
|
||||
}
|
||||
gfile.P(`Handler: "rpc",`)
|
||||
|
||||
return
|
||||
}
|
||||
|
13
variables.go
13
variables.go
@@ -11,12 +11,13 @@ var (
|
||||
gorillaMuxPackage = protogen.GoImportPath("github.com/gorilla/mux")
|
||||
chiPackage = protogen.GoImportPath("github.com/go-chi/chi/v5")
|
||||
chiMiddlewarePackage = protogen.GoImportPath("github.com/go-chi/chi/v5/middleware")
|
||||
microApiPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/api")
|
||||
microClientPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/client")
|
||||
microServerPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/server")
|
||||
microClientHttpPackage = protogen.GoImportPath("github.com/unistack-org/micro-client-http/v3")
|
||||
microCodecPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/codec")
|
||||
microApiPackage = protogen.GoImportPath("go.unistack.org/micro/v3/api")
|
||||
microClientPackage = protogen.GoImportPath("go.unistack.org/micro/v3/client")
|
||||
microServerPackage = protogen.GoImportPath("go.unistack.org/micro/v3/server")
|
||||
microClientHttpPackage = protogen.GoImportPath("go.unistack.org/micro-client-http/v3")
|
||||
microServerHttpPackage = protogen.GoImportPath("go.unistack.org/micro-server-http/v3")
|
||||
microCodecPackage = protogen.GoImportPath("go.unistack.org/micro/v3/codec")
|
||||
timePackage = protogen.GoImportPath("time")
|
||||
deprecationComment = "// Deprecated: Do not use."
|
||||
versionComment = "v3.4.2"
|
||||
versionComment = "v3.5.3"
|
||||
)
|
||||
|
Reference in New Issue
Block a user