blob: c201bf406a0f61f51fc0705102f4caa17050401e [file] [log] [blame]
// Copyright 2016 The Chromium 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
import (
"text/template"
)
const fieldEncodingTmplText = `
{{- define "FieldEncodingTmpl" -}}
{{- $info := . -}}
{{- if and (not $info.IsUnion) $info.IsNullable -}}
if {{$info.Identifier}} == nil {
{{- if $info.IsPointer -}}
encoder.WriteNullPointer()
{{- else if or $info.IsInterfaceRequest $info.IsHandle -}}
encoder.WriteInvalidHandle()
{{- else if $info.IsInterface -}}
encoder.WriteInvalidInterface()
{{- end -}}
} else {
{{ template "NonNullableFieldEncodingTmpl" $info }}
}
{{- else -}}
{{ template "NonNullableFieldEncodingTmpl" $info }}
{{- end -}}
{{- end -}}
`
const nonNullableFieldEncodingTmplText = `
{{- define "NonNullableFieldEncodingTmpl" -}}
{{- $info := . -}}
{{- if $info.IsPointer -}}
if err := encoder.WritePointer(); err != nil {
return err
}
{{end -}}
{{- if $info.IsSimple -}}
if err := encoder.{{$info.WriteFunction}}({{$info.Identifier}}); err != nil {
return err
}
{{- else if $info.IsEnum -}}
if err := encoder.WriteInt32(int32({{$info.Identifier}})); err != nil {
return err
}
{{- else if $info.IsHandle -}}
{{- if $info.IsNullable -}}
if err := encoder.WriteHandle(*({{$info.Identifier}})); err != nil {
{{- else -}}
if err := encoder.WriteHandle({{$info.Identifier}}); err != nil {
{{- end -}}
return err
}
{{- else if $info.IsStruct -}}
if err := {{$info.Identifier}}.Encode(encoder); err != nil {
return err
}
{{- else if $info.IsUnion -}}
{{- if $info.IsPointer -}}
encoder.StartNestedUnion()
{{end -}}
if {{$info.Identifier}} == nil {
{{- if $info.IsNullable -}}
encoder.WriteNullUnion()
{{- else -}}
return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpected null union"}
{{- end -}}
} else {
if err := {{$info.Identifier}}.Encode(encoder); err != nil {
return err
}
}
{{- else if $info.IsInterface -}}
if err := encoder.{{$info.WriteFunction}}({{$info.Identifier}}.PassMessagePipe()); err != nil {
return err
}
{{- else if $info.IsArray -}}
{{ $elInfo := $info.ElementEncodingInfo -}}
encoder.StartArray(uint32(len({{$info.Identifier}})), {{$elInfo.BitSize}})
for _, {{$elInfo.Identifier}} := range {{$info.Identifier}} {
{{ template "FieldEncodingTmpl" $elInfo }}
}
if err := encoder.Finish(); err != nil {
return err
}
{{- else if $info.IsMap -}}
{{ $keyInfo := $info.KeyEncodingInfo -}}
{{ $keyElId := $info.KeyEncodingInfo.ElementEncodingInfo.Identifier -}}
{{ $valueInfo := $info.ValueEncodingInfo -}}
{{ $valueElId := $info.ValueEncodingInfo.ElementEncodingInfo.Identifier -}}
encoder.StartMap()
{
var {{$keyInfo.Identifier}} {{$keyInfo.GoType}}
var {{$valueInfo.Identifier}} {{$valueInfo.GoType}}
for {{$keyElId}} := range {{$info.Identifier}} {
{{$keyInfo.Identifier}} = append({{$keyInfo.Identifier}}, {{$keyElId}})
}
if encoder.Deterministic() {
bindings.SortMapKeys(&{{$keyInfo.Identifier}})
}
for {{$keyElId}} := range {{$keyInfo.Identifier}} {
{{$valueInfo.Identifier}} = append({{$valueInfo.Identifier}}, {{$info.Identifier}}[{{$keyElId}}])
}
{{ template "FieldEncodingTmpl" $keyInfo }}
{{ template "FieldEncodingTmpl" $valueInfo }}
}
if err := encoder.Finish(); err != nil {
return err
}
{{- end -}}
{{- end -}}
`
func initEncodingTemplates() {
template.Must(goFileTmpl.Parse(nonNullableFieldEncodingTmplText))
template.Must(goFileTmpl.Parse(fieldEncodingTmplText))
}