github.com/s7techlab/cckit@v0.10.5/gateway/protoc-gen-cc-gateway/generator/template.go (about) 1 package generator 2 3 import ( 4 "text/template" 5 6 "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway/descriptor" 7 ) 8 9 type TemplateParams struct { 10 *descriptor.File 11 Imports []descriptor.GoPackage 12 Opts Opts 13 } 14 15 var ( 16 headerTemplate = template.Must(template.New("header").Funcs(funcMap).Parse(` 17 // Code generated by protoc-gen-cc-gateway. DO NOT EDIT. 18 // source: {{ .GetName }} 19 20 /* 21 Package {{ .GoPkg.Name }} contains 22 * chaincode methods names {service_name}Chaincode_{method_name} 23 * chaincode interface definition {service_name}Chaincode 24 * chaincode gateway definition {service_name}}Gateway 25 * chaincode service to cckit router registration func 26 */ 27 package {{ .GoPkg.Name }} 28 import ( 29 {{ range $i := .Imports }}{{ if $i.Standard }}{{ $i | printf "%s\n" }}{{ end }}{{ end }} 30 31 {{ range $i := .Imports }}{{ if not $i.Standard }}{{ $i | printf "%s\n" }}{{ end }}{{ end }} 32 ) 33 `)) 34 ) 35 36 var ccTemplate = template.Must(template.New("chaincode").Funcs(funcMap).Option().Parse(` 37 38 {{ $chaincodeMethodServicePrefix := .Opts.ChaincodeMethodServicePrefix }} 39 40 {{ range $svc := .Services }} 41 42 // {{ $svc.GetName }}Chaincode method names 43 const ( 44 45 {{ $methodPrefix := "" }} 46 47 {{ if $chaincodeMethodServicePrefix }} 48 {{ $methodPrefix = printf "%s." $svc.GetName }} 49 {{ end }} 50 51 // {{ $svc.GetName }}ChaincodeMethodPrefix allows to use multiple services with same method names in one chaincode 52 {{ $svc.GetName }}ChaincodeMethodPrefix = "{{ $methodPrefix }}" 53 54 {{ range $m := $svc.Methods }} 55 {{ $svc.GetName }}Chaincode_{{ $m.GetName }} = {{ $svc.GetName }}ChaincodeMethodPrefix + "{{ $m.GetName }}" 56 {{ end }} 57 ) 58 59 // {{ $svc.GetName }}Chaincode chaincode methods interface 60 type {{ $svc.GetName }}Chaincode interface { 61 {{ range $m := $svc.Methods }} 62 {{ $m.GetName }} (cckit_router.Context, *{{$m.RequestType.GoType $m.Service.File.GoPkg.Path | goTypeName }}) (*{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}, error) 63 {{ end }} 64 } 65 66 // Register{{ $svc.GetName }}Chaincode registers service methods as chaincode router handlers 67 func Register{{ $svc.GetName }}Chaincode(r *cckit_router.Group, cc {{ $svc.GetName }}Chaincode) error { 68 69 {{ range $m := $svc.Methods }} 70 {{ $method := "Invoke"}} 71 {{ if $m | hasGetBinding }}{{ $method = "Query"}}{{ end }} 72 73 r.{{ $method }}({{ $svc.GetName }}Chaincode_{{ $m.GetName }}, 74 func(ctx cckit_router.Context) (interface{}, error) { 75 return cc.{{ $m.GetName }}(ctx, ctx.Param().(*{{$m.RequestType.GoType $m.Service.File.GoPkg.Path | goTypeName }})) 76 }, 77 cckit_defparam.Proto(&{{$m.RequestType.GoType $m.Service.File.GoPkg.Path | goTypeName }}{})) 78 79 {{ end }} 80 81 return nil 82 } 83 84 {{ end }} 85 `)) 86 87 var gatewayTemplate = template.Must(template.New("gateway").Funcs(funcMap).Option().Parse(` 88 89 {{ $source :=.Name }} 90 {{ $embedSwagger :=.Opts.EmbedSwagger }} 91 92 {{ range $svc := .Services }} 93 94 {{ if $embedSwagger }} 95 //go:embed {{ $source | removeExtension }}.swagger.json 96 {{ end }} var {{ $svc.GetName }}Swagger []byte 97 98 99 // New{{ $svc.GetName }}Gateway creates gateway to access chaincode method via chaincode service 100 func New{{ $svc.GetName }}Gateway(sdk cckit_sdk.SDK , channel, chaincode string, opts ...cckit_gateway.Opt) *{{ $svc.GetName }}Gateway { 101 return New{{ $svc.GetName }}GatewayFromInstance( 102 cckit_gateway.NewChaincodeInstanceService ( 103 sdk, 104 &cckit_gateway.ChaincodeLocator { Channel : channel, Chaincode: chaincode }, 105 opts..., 106 )) 107 } 108 109 func New{{ $svc.GetName }}GatewayFromInstance (chaincodeInstance cckit_gateway.ChaincodeInstance) *{{ $svc.GetName }}Gateway { 110 return &{{ $svc.GetName }}Gateway{ 111 ChaincodeInstance: chaincodeInstance, 112 } 113 } 114 115 // gateway implementation 116 // gateway can be used as kind of SDK, GRPC or REST server ( via grpc-gateway or clay ) 117 type {{ $svc.GetName }}Gateway struct { 118 ChaincodeInstance cckit_gateway.ChaincodeInstance 119 } 120 121 122 func (c *{{ $svc.GetName }}Gateway) Invoker() cckit_gateway.ChaincodeInstanceInvoker { 123 return cckit_gateway.NewChaincodeInstanceServiceInvoker(c.ChaincodeInstance) 124 } 125 126 127 // ServiceDef returns service definition 128 func (c *{{ $svc.GetName }}Gateway) ServiceDef() cckit_gateway.ServiceDef { 129 return cckit_gateway.NewServiceDef( 130 _{{ $svc.GetName }}_serviceDesc.ServiceName, 131 {{ $svc.GetName }}Swagger, 132 &_{{ $svc.GetName }}_serviceDesc, 133 c, 134 Register{{ $svc.GetName }}HandlerFromEndpoint, 135 ) 136 } 137 138 139 {{ range $m := $svc.Methods }} 140 {{ $method := "Invoke"}} 141 {{ if $m | hasGetBinding }}{{ $method = "Query"}}{{ end }} 142 143 func (c *{{ $svc.GetName }}Gateway) {{ $m.GetName }}(ctx context.Context, in *{{$m.RequestType.GoType $m.Service.File.GoPkg.Path | goTypeName }}) (*{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}, error) { 144 var inMsg interface{} = in 145 if v, ok := inMsg.(interface { Validate() error }); ok { 146 if err := v.Validate(); err != nil { 147 return nil, err 148 } 149 } 150 151 if res, err := c.Invoker().{{ $method }}(ctx, {{ $svc.GetName }}Chaincode_{{ $m.GetName }} , []interface{}{in}, &{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}{}); err != nil { 152 return nil, err 153 } else { 154 return res.(*{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}), nil 155 } 156 } 157 {{ end }} 158 159 {{ end }} 160 `)) 161 162 var resolverTemplate = template.Must(template.New("resolver").Funcs(funcMap).Option().Parse(` 163 164 {{ range $svc := .Services }} 165 166 // {{ $svc.GetName }}ChaincodeResolver interface for service resolver 167 type ( 168 {{ $svc.GetName }}ChaincodeResolver interface { 169 Resolve (ctx cckit_router.Context) ({{ $svc.GetName }}Chaincode, error) 170 } 171 172 {{ $svc.GetName }}ChaincodeLocalResolver struct { 173 service {{ $svc.GetName }}Chaincode 174 } 175 176 {{ $svc.GetName }}ChaincodeLocatorResolver struct { 177 locatorResolver cckit_gateway.ChaincodeLocatorResolver 178 service {{ $svc.GetName }}Chaincode 179 } 180 ) 181 182 func New{{ $svc.GetName }}ChaincodeLocalResolver (service {{ $svc.GetName }}Chaincode) *{{ $svc.GetName }}ChaincodeLocalResolver { 183 return &{{ $svc.GetName }}ChaincodeLocalResolver { 184 service: service, 185 } 186 } 187 188 func (r *{{ $svc.GetName }}ChaincodeLocalResolver) Resolve(ctx cckit_router.Context) ({{ $svc.GetName }}Chaincode, error) { 189 if r.service == nil { 190 return nil, errors.New ("service not set for local chaincode resolver") 191 } 192 193 return r.service, nil 194 } 195 196 func New{{ $svc.GetName }}ChaincodeResolver (locatorResolver cckit_gateway.ChaincodeLocatorResolver) *{{ $svc.GetName }}ChaincodeLocatorResolver { 197 return &{{ $svc.GetName }}ChaincodeLocatorResolver { 198 locatorResolver: locatorResolver, 199 } 200 } 201 202 func (r *{{ $svc.GetName }}ChaincodeLocatorResolver) Resolve(ctx cckit_router.Context) ({{ $svc.GetName }}Chaincode, error) { 203 if r.service != nil { 204 return r.service, nil 205 } 206 207 locator, err := r.locatorResolver(ctx, _{{ $svc.GetName }}_serviceDesc.ServiceName) 208 if err != nil { 209 return nil, err 210 } 211 212 r.service = New{{ $svc.GetName }}ChaincodeStubInvoker(locator) 213 return r.service, nil 214 } 215 216 217 type {{ $svc.GetName }}ChaincodeStubInvoker struct { 218 Invoker cckit_gateway.ChaincodeStubInvoker 219 } 220 221 func New{{ $svc.GetName }}ChaincodeStubInvoker(locator *cckit_gateway.ChaincodeLocator) *{{ $svc.GetName }}ChaincodeStubInvoker { 222 return &{{ $svc.GetName }}ChaincodeStubInvoker { 223 Invoker: &cckit_gateway.LocatorChaincodeStubInvoker{Locator: locator}, 224 } 225 } 226 227 228 {{ range $m := $svc.Methods }} 229 {{ $method := "Invoke"}} 230 {{ if $m | hasGetBinding }}{{ $method = "Query"}}{{ end }} 231 232 func (c *{{ $svc.GetName }}ChaincodeStubInvoker) {{ $m.GetName }}(ctx cckit_router.Context, in *{{$m.RequestType.GoType $m.Service.File.GoPkg.Path | goTypeName }}) (*{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}, error) { 233 234 {{ if $method | eq "Invoke" }} 235 return nil, cckit_gateway.ErrInvokeMethodNotAllowed 236 237 {{ else }} 238 var inMsg interface{} = in 239 if v, ok := inMsg.(interface { Validate() error }); ok { 240 if err := v.Validate(); err != nil { 241 return nil, err 242 } 243 } 244 245 if res, err := c.Invoker.{{ $method }}(ctx.Stub(), {{ $svc.GetName }}Chaincode_{{ $m.GetName }} , []interface{}{in}, &{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}{}); err != nil { 246 return nil, err 247 } else { 248 return res.(*{{ $m.ResponseType.GoType $m.Service.File.GoPkg.Path | goTypeName }}), nil 249 } 250 {{ end }} 251 } 252 {{ end }} 253 254 255 {{ end }} 256 257 `))