blob: 869dc7cfef014286a423b8248f84cd1d51d2dc2f [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package templates
const Interface = `
{{- define "InterfaceDefinition" -}}
const (
{{- range .Methods }}
{{ .OrdinalName }} uint32 = {{ .Ordinal }}
{{ .GenOrdinalName }} uint32 = {{ .GenOrdinal }}
{{- end }}
)
{{- range .Methods }}
{{- if .Request }}
{{ template "StructDefinition" .Request }}
{{- end }}
{{- if .Response }}
{{ template "StructDefinition" .Response }}
{{- end }}
{{- end }}
type {{ .ProxyName }} _bindings.{{ .ProxyType }}
{{ range .Methods }}
{{range .DocComments}}
//{{ . }}
{{- end}}
func (p *{{ $.ProxyName }}) {{ if .IsEvent -}}
{{ .EventExpectName }}
{{- else -}}
{{ .Name }}
{{- end -}}
(
{{- if .Request -}}
{{- range $index, $m := .Request.Members -}}
{{- if $index -}}, {{- end -}}
{{ $m.PrivateName }} {{ $m.Type }}
{{- end -}}
{{- end -}}
)
{{- if .Response -}}
{{- if len .Response.Members }} (
{{- range .Response.Members }}{{ .Type }}, {{ end -}}
error)
{{- else }} error{{ end -}}
{{- else }} error{{ end }} {
{{- if .Request }}
req_ := {{ .Request.Name }}{
{{- range .Request.Members }}
{{ .Name }}: {{ .PrivateName }},
{{- end }}
}
{{- end }}
{{- if .Response }}
resp_ := {{ .Response.Name }}{}
{{- end }}
{{- if .Request }}
{{- if .Response }}
err := ((*_bindings.{{ $.ProxyType }})(p)).Call({{ .OrdinalName }}, &req_, &resp_)
{{- else }}
err := ((*_bindings.{{ $.ProxyType }})(p)).Send({{ .OrdinalName }}, &req_)
{{- end }}
{{- else }}
{{- if .Response }}
err := ((*_bindings.{{ $.ProxyType }})(p)).Recv({{ .OrdinalName }}, &resp_{{ if ne .Ordinal .GenOrdinal }}, {{ .GenOrdinalName }}{{ end }})
{{- else }}
err := nil
{{- end }}
{{- end }}
{{- if .Response }}
return {{ range .Response.Members }}resp_.{{ .Name }}, {{ end }}err
{{- else }}
return err
{{- end }}
}
{{- end }}
{{range .DocComments}}
//{{ . }}
{{- end}}
type {{ .Name }} interface {
{{- range .Methods }}
{{- range .DocComments}}
//{{ . }}
{{- end}}
{{- if .Request }}
{{ .Name }}(
{{- range $index, $m := .Request.Members -}}
{{- if $index -}}, {{- end -}}
{{ $m.PrivateName }} {{ $m.Type }}
{{- end -}}
)
{{- if .Response -}}
{{- if len .Response.Members }} (
{{- range .Response.Members }}{{ .Type }}, {{ end -}}
error)
{{- else }} error{{ end -}}
{{- else }} error{{ end }}
{{- end }}
{{- end }}
}
type {{.TransitionalBaseName}} struct {}
{{ $transitionalBaseName := .TransitionalBaseName }}
{{- range $method := .Methods }}
{{- if $method.IsTransitional }}
{{- if $method.Request }}
func (_ *{{$transitionalBaseName}}) {{ $method.Name }} (
{{- range $index, $m := $method.Request.Members -}}
{{- if $index -}}, {{- end -}}
{{ $m.PrivateName }} {{ $m.Type }}
{{- end -}}
)
{{- if $method.Response -}}
{{- if len $method.Response.Members }} (
{{- range $method.Response.Members }}{{ .Type }}, {{ end -}}
error)
{{- else -}}
error
{{ end -}}
{{- else -}}
error
{{- end -}}
{
panic("Not Implemented")
}
{{- end -}}
{{- end}}
{{- end }}
{{- if eq .ProxyType "ChannelProxy" }}
type {{ .RequestName }} _bindings.InterfaceRequest
func New{{ .RequestName }}() ({{ .RequestName }}, *{{ .ProxyName }}, error) {
req, cli, err := _bindings.NewInterfaceRequest()
return {{ .RequestName }}(req), (*{{ .ProxyName }})(cli), err
}
{{- if .ServiceNameString }}
// Implements ServiceRequest.
func (_ {{ .RequestName }}) Name() string {
return {{ .ServiceNameString }}
}
func (c {{ .RequestName }}) ToChannel() _zx.Channel {
return c.Channel
}
const {{ .ServiceNameConstant }} = {{ .ServiceNameString }}
{{- end }}
{{- end }}
type {{ .StubName }} struct {
Impl {{ .Name }}
}
func (s *{{ .StubName }}) Dispatch(ord uint32, b_ []byte, h_ []_zx.Handle) (_bindings.Payload, error) {
switch ord {
{{- range .Methods }}
{{- if not .IsEvent }}
{{- if ne .Ordinal .GenOrdinal }}
case {{ .GenOrdinalName }}:
fallthrough
{{ end }}
case {{ .OrdinalName }}:
{{- if .Request }}
in_ := {{ .Request.Name }}{}
if err_ := _bindings.Unmarshal(b_, h_, &in_); err_ != nil {
return nil, err_
}
{{- end }}
{{- if .Response }}
out_ := {{ .Response.Name }}{}
{{- end }}
{{ if .Response }}
{{- range .Response.Members }}{{ .PrivateName }}, {{ end -}}
{{- end -}}
err_ := s.Impl.{{ .Name }}(
{{- if .Request -}}
{{- range $index, $m := .Request.Members -}}
{{- if $index -}}, {{- end -}}
in_.{{ $m.Name }}
{{- end -}}
{{- end -}}
)
{{- if .Response }}
{{- range .Response.Members }}
out_.{{ .Name }} = {{ .PrivateName }}
{{- end }}
return &out_, err_
{{- else }}
return nil, err_
{{- end }}
{{- end }}
{{- end }}
}
return nil, _bindings.ErrUnknownOrdinal
}
{{- if eq .ProxyType "ChannelProxy" }}
type {{ .ServerName }} struct {
_bindings.BindingSet
}
func (s *{{ .ServerName }}) Add(impl {{ .Name }}, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
return s.BindingSet.Add(&{{ .StubName }}{Impl: impl}, c, onError)
}
func (s *{{ .ServerName }}) EventProxyFor(key _bindings.BindingKey) (*{{ .EventProxyName }}, bool) {
pxy, err := s.BindingSet.ProxyFor(key)
return (*{{ .EventProxyName }})(pxy), err
}
{{- end }}
type {{ .EventProxyName }} _bindings.{{ .ProxyType }}
{{ range .Methods }}
{{- if .IsEvent }}
func (p *{{ $.EventProxyName }}) {{ .Name }}(
{{- range $index, $m := .Response.Members -}}
{{- if $index -}}, {{- end -}}
{{ $m.PrivateName }} {{ $m.Type }}
{{- end -}}
) error {
{{- if .Response }}
event_ := {{ .Response.Name }}{
{{- range .Response.Members }}
{{ .Name }}: {{ .PrivateName }},
{{- end }}
}
{{- end }}
return ((*_bindings.{{ $.ProxyType }})(p)).Send({{ .OrdinalName }}, &event_)
}
{{- end }}
{{- end }}
{{ end -}}
`