Compare commits

...

4 Commits

Author SHA1 Message Date
f814b489db update
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2021-10-27 15:29:48 +03:00
2ec1af2884 add support for cookie and header variables
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2021-10-24 00:52:39 +03:00
a63ea1ec4d fix import paths
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2021-10-23 23:34:05 +03:00
74fecbec12 cleanup deps
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2021-10-23 23:30:16 +03:00
7 changed files with 90 additions and 37 deletions

View File

@@ -10,7 +10,7 @@ This project is a generator plugin for the Google Protocol Buffers compiler (`pr
## Usage ## Usage
```console ```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 | Option | Default Value | Accepted Values | Description
@@ -22,5 +22,5 @@ $> protoc --micro_out=debug=true,components="micro|http":. input.proto
## Install ## Install
* Install the **go** compiler and tools from https://golang.org/doc/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**: `go install 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-micro**: `go install go.unistack.org/protoc-gen-go-micro/v3`

View File

@@ -11,7 +11,7 @@ import "google/protobuf/wrappers.proto";
service Example { service Example {
rpc Call(CallReq) returns (CallRsp) { rpc Call(CallReq) returns (CallRsp) {
option (micro.openapiv2.openapiv2_operation) = { option (micro.openapiv3.openapiv3_operation) = {
operation_id: "Call"; operation_id: "Call";
responses: { responses: {
key: "default"; key: "default";

4
go.mod
View File

@@ -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 go 1.16
require ( require (
github.com/fatih/structtag v1.2.0 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 go.unistack.org/micro-proto/v3 v3.1.0
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/protobuf v1.27.1 google.golang.org/protobuf v1.27.1
) )
//replace go.unistack.org/micro/v3 => ../micro
//replace go.unistack.org/micro-proto => ../micro-proto //replace go.unistack.org/micro-proto => ../micro-proto

19
go.sum
View File

@@ -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 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= 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/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 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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 h1:q39FwjFiRZn+Ux/tt+d3bJTmDtsQQWa+3SLYVo1vLfA=
go.unistack.org/micro-proto/v3 v3.1.0/go.mod h1:DpRhYCBXlmSJ/AAXTmntvlh7kQkYU6eFvlmYAx4BQS8= 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-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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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.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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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=

View File

@@ -22,7 +22,6 @@ import (
"sort" "sort"
"strings" "strings"
jsonpbcodec "github.com/unistack-org/micro-codec-jsonpb/v3"
annotations "go.unistack.org/micro-proto/v3/api" annotations "go.unistack.org/micro-proto/v3/api"
v3 "go.unistack.org/micro-proto/v3/openapiv3" v3 "go.unistack.org/micro-proto/v3/openapiv3"
"google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/compiler/protogen"
@@ -51,7 +50,7 @@ func (g *Generator) openapiv3Generate(component string, plugin *protogen.Plugin)
d := og.buildDocumentV3(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 { if err != nil {
return fmt.Errorf("failed to marshal: %s", err.Error()) return fmt.Errorf("failed to marshal: %s", err.Error())
} }
@@ -223,6 +222,15 @@ func (g *openapiv3Generator) buildOperationV3(
parameters = append(parameters, opt.Parameters...) 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. // Build a list of path parameters.
pathParameters := make([]string, 0) pathParameters := make([]string, 0)
if matches := g.namePattern.FindStringSubmatch(path); matches != nil { if matches := g.namePattern.FindStringSubmatch(path); matches != nil {
@@ -245,6 +253,10 @@ func (g *openapiv3Generator) buildOperationV3(
} }
// Add the path parameters to the operation parameters. // Add the path parameters to the operation parameters.
for _, pathParameter := range pathParameters { for _, pathParameter := range pathParameters {
if _, ok := sparameters[pathParameter]; ok {
continue
}
parameters = append(parameters, parameters = append(parameters,
&v3.ParameterOrReference{ &v3.ParameterOrReference{
Oneof: &v3.ParameterOrReference_Parameter{ Oneof: &v3.ParameterOrReference_Parameter{
@@ -269,6 +281,9 @@ func (g *openapiv3Generator) buildOperationV3(
for _, field := range inputMessage.Fields { for _, field := range inputMessage.Fields {
fieldName := string(field.Desc.Name()) fieldName := string(field.Desc.Name())
if !contains(coveredParameters, fieldName) { if !contains(coveredParameters, fieldName) {
if _, ok := sparameters[fieldName]; ok {
continue
}
// Get the field description from the comments. // Get the field description from the comments.
fieldDescription := g.filterCommentString(field.Comments.Leading) fieldDescription := g.filterCommentString(field.Comments.Leading)
parameters = append(parameters, parameters = append(parameters,

64
util.go
View File

@@ -2,7 +2,6 @@ package main
import ( import (
"fmt" "fmt"
"log"
"net/http" "net/http"
"strings" "strings"
@@ -92,13 +91,39 @@ func generateServiceClientMethods(gfile *protogen.GeneratedFile, service *protog
gfile.P(")") gfile.P(")")
} }
parameters := make(map[string]map[string]string)
// Build a list of header parameters. // Build a list of header parameters.
eopt := proto.GetExtension(method.Desc.Options(), v3.E_Openapiv3Operation) eopt := proto.GetExtension(method.Desc.Options(), v3.E_Openapiv3Operation)
if eopt != nil && eopt != v3.E_Openapiv3Operation.InterfaceOf(v3.E_Openapiv3Operation.Zero()) { if eopt != nil && eopt != v3.E_Openapiv3Operation.InterfaceOf(v3.E_Openapiv3Operation.Zero()) {
opt := eopt.(*v3.Operation) 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 { 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})") gfile.P("return h.", serviceName, "Server.", method.GoName, "(ctx, &", unexport(serviceName), method.GoName, "Stream{stream})")
} }
} else { } 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("return h.", serviceName, "Server.", method.GoName, "(ctx, req, rsp)")
} }
gfile.P("}") gfile.P("}")
@@ -593,6 +651,4 @@ func generateEndpoint(gfile *protogen.GeneratedFile, serviceName string, methodN
gfile.P("Stream: true,") gfile.P("Stream: true,")
} }
gfile.P(`Handler: "rpc",`) gfile.P(`Handler: "rpc",`)
return
} }

View File

@@ -11,12 +11,13 @@ var (
gorillaMuxPackage = protogen.GoImportPath("github.com/gorilla/mux") gorillaMuxPackage = protogen.GoImportPath("github.com/gorilla/mux")
chiPackage = protogen.GoImportPath("github.com/go-chi/chi/v5") chiPackage = protogen.GoImportPath("github.com/go-chi/chi/v5")
chiMiddlewarePackage = protogen.GoImportPath("github.com/go-chi/chi/v5/middleware") chiMiddlewarePackage = protogen.GoImportPath("github.com/go-chi/chi/v5/middleware")
microApiPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/api") microApiPackage = protogen.GoImportPath("go.unistack.org/micro/v3/api")
microClientPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/client") microClientPackage = protogen.GoImportPath("go.unistack.org/micro/v3/client")
microServerPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/server") microServerPackage = protogen.GoImportPath("go.unistack.org/micro/v3/server")
microClientHttpPackage = protogen.GoImportPath("github.com/unistack-org/micro-client-http/v3") microClientHttpPackage = protogen.GoImportPath("go.unistack.org/micro-client-http/v3")
microCodecPackage = protogen.GoImportPath("github.com/unistack-org/micro/v3/codec") microServerHttpPackage = protogen.GoImportPath("go.unistack.org/micro-server-http/v3")
microCodecPackage = protogen.GoImportPath("go.unistack.org/micro/v3/codec")
timePackage = protogen.GoImportPath("time") timePackage = protogen.GoImportPath("time")
deprecationComment = "// Deprecated: Do not use." deprecationComment = "// Deprecated: Do not use."
versionComment = "v3.4.2" versionComment = "v3.5.3"
) )