| Index: third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/interface.tmpl
|
| diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/interface.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/interface.tmpl
|
| index 484845d9546fe0b349976535e3f203f53ab08541..32ba383839d33b2e04724db70654b5ccd3283c05 100644
|
| --- a/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/interface.tmpl
|
| +++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/interface.tmpl
|
| @@ -4,11 +4,162 @@
|
|
|
| {% import "struct.tmpl" as struct_macros %}
|
|
|
| +{%- macro declare_params(struct) %}
|
| +{%- for field in struct.fields -%}
|
| + {{field|name(False)}} {{field.kind|go_type}}{% if not loop.last %}, {% endif %}
|
| +{%- endfor %}
|
| +{%- endmacro %}
|
| +
|
| +
|
| +
|
| +{% macro declare_request_params(method) %}
|
| +({{declare_params(method|struct_from_method)}})
|
| +{%- if method.response_parameters|is_none_or_empty -%}
|
| + {{' (err error)'}}
|
| +{%- else -%}
|
| + {{' '}}({{declare_params(method|response_struct_from_method)}}, err error)
|
| +{%- endif -%}
|
| +{% endmacro %}
|
| +
|
| +
|
| +
|
| +{%- macro flags(response_parameters, is_renponse) -%}
|
| +{%- if not response_parameters -%}
|
| + bindings.MessageNoFlag
|
| +{%- elif is_parameter: -%}
|
| + bindings.MessageExpectsResponseFlag
|
| +{%- else -%}
|
| + bindings.MessageIsResponseFlag
|
| +{%- endif -%}
|
| +{%- endmacro -%}
|
| +
|
| +
|
| +
|
| {% macro define(interface) %}
|
| +type {{interface|name}} interface {
|
| +{% for method in interface.methods %}
|
| + {{method|name}}{{declare_request_params(method)}}
|
| +{% endfor %}
|
| +}
|
| +
|
| +type {{interface|name}}Request bindings.InterfaceRequest
|
| +type {{interface|name}}Pointer bindings.InterfacePointer
|
| +
|
| +{% for method in interface.methods %}
|
| +const {{interface|name(False)}}_{{method|name}}_Name = {{method.ordinal}}
|
| +{% endfor %}
|
| +
|
| +type {{interface|name}}Proxy struct {
|
| + router *bindings.Router
|
| + ids *bindings.Counter
|
| +}
|
| +
|
| +func New{{interface|name}}Proxy(p {{interface|name}}Pointer, waiter bindings.AsyncWaiter) *{{interface|name}}Proxy {
|
| + return &{{interface|name}}Proxy{
|
| + bindings.NewRouter(p.PassMessagePipe(), waiter),
|
| + &bindings.Counter{},
|
| + }
|
| +}
|
| +
|
| +func (p *{{interface|name}}Proxy) Close_proxy() {
|
| + p.router.Close()
|
| +}
|
| +
|
| {% for method in interface.methods %}
|
| {{struct_macros.define(method|struct_from_method, False)}}
|
| {%- if method.response_parameters %}
|
| {{struct_macros.define(method|response_struct_from_method, False)}}
|
| +{%- endif %}
|
| +func (p *{{interface|name}}Proxy) {{method|name}}{{declare_request_params(method)}} {
|
| + payload := &{{method|struct_from_method|name(False)}}{
|
| +{% for field in (method|struct_from_method).fields %}
|
| + {{field|name(False)}},
|
| +{% endfor %}
|
| + }
|
| + header := bindings.MessageHeader{
|
| + Type: {{interface|name(False)}}_{{method|name}}_Name,
|
| + Flags: {{flags(method.response_parameters, False)}},
|
| +{% if method.response_parameters %}
|
| + RequestId: p.ids.Next(),
|
| {% endif %}
|
| + }
|
| + var message *bindings.Message
|
| + if message, err = bindings.EncodeMessage(header, payload); err != nil {
|
| + err = fmt.Errorf("can't encode request: %v", err.Error())
|
| + return
|
| + }
|
| +{% if method.response_parameters %}
|
| + readResult := <-p.router.AcceptWithResponse(message)
|
| + if err = readResult.Error; err != nil {
|
| + return
|
| + }
|
| + var response {{method|response_struct_from_method|name(False)}}
|
| + if err = readResult.Message.DecodePayload(&response); err != nil {
|
| + err = fmt.Errorf("can't decode response: %v", err.Error())
|
| + return
|
| + }
|
| +{% for field in (method|response_struct_from_method).fields %}
|
| + {{field|name(False)}} = response.{{field|name(False)}}
|
| +{% endfor %}
|
| +{% else %}
|
| + err = p.router.Accept(message)
|
| +{% endif %}
|
| + return
|
| +}
|
| +
|
| {% endfor %}
|
| -{% endmacro %}
|
| +type {{interface|name(False)}}Stub struct {
|
| + connector *bindings.Connector
|
| + impl {{interface|name}}
|
| +}
|
| +
|
| +func New{{interface|name}}Stub(r {{interface|name}}Request, impl {{interface|name}}, waiter bindings.AsyncWaiter) *bindings.Stub {
|
| + connector := bindings.NewConnector(r.PassMessagePipe(), waiter)
|
| + return bindings.NewStub(connector, &{{interface|name(False)}}Stub{connector, impl})
|
| +}
|
| +
|
| +func (s *{{interface|name(False)}}Stub) Accept(message *bindings.Message) (err error) {
|
| + switch message.Header.Type {
|
| +{% for method in interface.methods %}
|
| + case {{interface|name(False)}}_{{method|name}}_Name:
|
| + var request {{method|struct_from_method|name(False)}}
|
| + if err := message.DecodePayload(&request); err != nil {
|
| + return fmt.Errorf("can't decode request: %v", err.Error())
|
| + }
|
| +{% if method.response_parameters %}
|
| + var response {{method|response_struct_from_method|name(False)}}
|
| +{% endif %}
|
| +{% if method.response_parameters|is_none_or_empty %}
|
| + err = s.impl.{{method|name}}(
|
| +{%- else -%}
|
| +{% for field in (method|response_struct_from_method).fields %}
|
| + response.{{field|name(False)}}{{', '}}
|
| +{%- endfor -%}err = s.impl.{{method|name}}(
|
| +{%- endif -%}
|
| +{%- for field in (method|struct_from_method).fields -%}
|
| + request.{{field|name(False)}}{% if not loop.last %}, {% endif %}
|
| +{%- endfor -%}
|
| + )
|
| + if err != nil {
|
| + return
|
| + }
|
| +{% if method.response_parameters %}
|
| + header := bindings.MessageHeader{
|
| + Type: {{interface|name(False)}}_{{method|name}}_Name,
|
| + Flags: {{flags(method.response_parameters, True)}},
|
| + RequestId: message.Header.RequestId,
|
| + }
|
| + message, err = bindings.EncodeMessage(header, &response)
|
| + if err != nil {
|
| + return fmt.Errorf("can't encode response: %v", err.Error())
|
| + }
|
| + return s.connector.WriteMessage(message)
|
| +{% endif %}
|
| +{% endfor %}
|
| + default:
|
| + return fmt.Errorf("unsupported request type %v", message.Header.Type);
|
| + }
|
| + return
|
| +}
|
| +
|
| +{% endmacro %}
|
|
|