thrift/thrift-gen/tchannel-template.go (159 lines of code) (raw):
package main
var tchannelTmpl = `
// @generated Code generated by thrift-gen. Do not modify.
// Package {{ .Package }} is generated code used to make or handle TChannel calls using Thrift.
package {{ .Package }}
import (
"fmt"
athrift "{{ .Imports.Thrift }}"
"{{ .Imports.TChannel }}"
{{ range .Includes }}
"{{ .Import }}"
{{ end }}
)
{{ range .Includes }}
var _ = {{ .Package }}.GoUnusedProtection__
{{ end }}
// Interfaces for the service and client for the services defined in the IDL.
{{ range .Services }}
// {{ .Interface }} is the interface that defines the server handler and client interface.
type {{ .Interface }} interface {
{{ if .HasExtends }}
{{ .ExtendsServicePrefix }}{{ .ExtendsService.Interface }}
{{ end }}
{{ range .Methods }}
{{ .Name }}({{ .ArgList }}) {{ .RetType }}
{{ end }}
}
{{ end }}
// Implementation of a client and service handler.
{{/* Generate client and service implementations for the above interfaces. */}}
{{ range $svc := .Services }}
type {{ .ClientStruct }} struct {
{{ if .HasExtends }}
{{ .ExtendsServicePrefix }}{{ .ExtendsService.Interface }}
{{ end }}
thriftService string
client thrift.TChanClient
}
func {{ .InheritedClientConstructor }}(thriftService string, client thrift.TChanClient) *{{ .ClientStruct }} {
return &{{ .ClientStruct }}{
{{ if .HasExtends }}
{{ .ExtendsServicePrefix }}{{ .ExtendsService.InheritedClientConstructor }}(thriftService, client),
{{ end }}
thriftService,
client,
}
}
// {{ .ClientConstructor }} creates a client that can be used to make remote calls.
func {{ .ClientConstructor }}(client thrift.TChanClient) {{ .Interface }} {
return {{ .InheritedClientConstructor }}("{{ .ThriftName }}", client)
}
{{ range .Methods }}
func (c *{{ $svc.ClientStruct }}) {{ .Name }}({{ .ArgList }}) {{ .RetType }} {
var resp {{ .ResultType }}
args := {{ .ArgsType }}{
{{ range .Arguments }}
{{ .ArgStructName }}: {{ .Name }},
{{ end }}
}
success, err := c.client.Call(ctx, c.thriftService, "{{ .ThriftName }}", &args, &resp)
if err == nil && !success {
switch {
{{ range .Exceptions }}
case resp.{{ .ArgStructName }} != nil:
err = resp.{{ .ArgStructName }}
{{ end }}
default:
err = fmt.Errorf("received no result or unknown exception for {{ .ThriftName }}")
}
}
{{ if .HasReturn }}
return resp.GetSuccess(), err
{{ else }}
return err
{{ end }}
}
{{ end }}
type {{ .ServerStruct }} struct {
{{ if .HasExtends }}
thrift.TChanServer
{{ end }}
handler {{ .Interface }}
}
// {{ .ServerConstructor }} wraps a handler for {{ .Interface }} so it can be
// registered with a thrift.Server.
func {{ .ServerConstructor }}(handler {{ .Interface }}) thrift.TChanServer {
return &{{ .ServerStruct }}{
{{ if .HasExtends }}
{{ .ExtendsServicePrefix }}{{ .ExtendsService.ServerConstructor }}(handler),
{{ end }}
handler,
}
}
func (s *{{ .ServerStruct }}) Service() string {
return "{{ .ThriftName }}"
}
func (s *{{ .ServerStruct }}) Methods() []string {
return []string{
{{ range .Methods }}
"{{ .ThriftName }}",
{{ end }}
{{ range .InheritedMethods }}
"{{ . }}",
{{ end }}
}
}
func (s *{{ .ServerStruct }}) Handle(ctx {{ contextType }}, methodName string, protocol athrift.TProtocol) (bool, athrift.TStruct, error) {
switch methodName {
{{ range .Methods }}
case "{{ .ThriftName }}":
return s.{{ .HandleFunc }}(ctx, protocol)
{{ end }}
{{ range .InheritedMethods }}
case "{{ . }}":
return s.TChanServer.Handle(ctx, methodName, protocol)
{{ end }}
default:
return false, nil, fmt.Errorf("method %v not found in service %v", methodName, s.Service())
}
}
{{ range .Methods }}
func (s *{{ $svc.ServerStruct }}) {{ .HandleFunc }}(ctx {{ contextType }}, protocol athrift.TProtocol) (bool, athrift.TStruct, error) {
var req {{ .ArgsType }}
var res {{ .ResultType }}
if err := req.Read(protocol); err != nil {
return false, nil, err
}
{{ if .HasReturn }}
r, err :=
{{ else }}
err :=
{{ end }}
s.handler.{{ .Name }}({{ .CallList "req" }})
if err != nil {
{{ if .HasExceptions }}
switch v := err.(type) {
{{ range .Exceptions }}
case {{ .ArgType }}:
if v == nil {
return false, nil, fmt.Errorf("Handler for {{ .Name }} returned non-nil error type {{ .ArgType }} but nil value")
}
res.{{ .ArgStructName }} = v
{{ end }}
default:
return false, nil, err
}
{{ else }}
return false, nil, err
{{ end }}
} else {
{{ if .HasReturn }}
res.Success = {{ .WrapResult "r" }}
{{ end }}
}
return err == nil, &res, nil
}
{{ end }}
{{ end }}
`