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  `))