OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 {% import "encoding_macros.tmpl" as encoding_macros %} | |
6 {% import "runtime_type_macros.tmpl" as runtime_type_macros %} | |
7 | |
8 {% macro define(union, typepkg, package, exported=True) %} | |
9 type {{union|name(exported)}} interface { | |
10 Tag() uint32 | |
11 Interface() interface{} | |
12 __Reflect(__{{union|name(exported)}}Reflect) | |
13 Encode(encoder *bindings.Encoder) error | |
14 } | |
15 | |
16 {{runtime_type_macros.maybeWriteStaticMojomTypeAccessor(typepkg, union)}} | |
17 | |
18 type __{{union|name(exported)}}Reflect struct { | |
19 {% for field in union.fields %} | |
20 {{field|name(exported)}} {{field.kind|go_type}} | |
21 {% endfor %} | |
22 } | |
23 | |
24 func Decode{{union|name(exported)}}(decoder *bindings.Decoder) ({{union|name(exp
orted)}}, error) { | |
25 size, tag, err := decoder.ReadUnionHeader() | |
26 if err != nil { | |
27 return nil, err | |
28 } | |
29 | |
30 if size == 0 { | |
31 decoder.SkipUnionValue() | |
32 return nil, nil | |
33 } | |
34 | |
35 switch tag { | |
36 {% for field in union.fields %} | |
37 case {{field.ordinal}}: | |
38 var value {{union|name(exported)}}{{field|name(exported)}} | |
39 if err := value.decodeInternal(decoder); err != nil { | |
40 return nil, err | |
41 } | |
42 decoder.FinishReadingUnionValue() | |
43 return &value, nil | |
44 {% endfor %} | |
45 } | |
46 | |
47 decoder.SkipUnionValue() | |
48 return &{{union|name(exported)}}Unknown{tag: tag}, nil | |
49 } | |
50 | |
51 {% set struct_name = union|name(exported) + 'Unknown' %} | |
52 type {{struct_name}} struct { tag uint32 } | |
53 func (u *{{struct_name}}) Tag() uint32 { return u.tag } | |
54 func (u *{{struct_name}}) Interface() interface{} { return nil } | |
55 func (u *{{struct_name}}) __Reflect(__{{union|name(exported)}}Reflect) {} | |
56 | |
57 func (u *{{struct_name}}) Encode(encoder *bindings.Encoder) error { | |
58 return fmt.Errorf("Trying to serialize an unknown {{union|name(exported)
}}. There is no sane way to do that!"); | |
59 } | |
60 | |
61 {% for field in union.fields %} | |
62 {%- set struct_name = union|name(exported) + field|name(exported) %} | |
63 type {{struct_name}} struct { Value {{field.kind|go_type}} } | |
64 func (u *{{struct_name}}) Tag() uint32 { return {{field.ordinal}} } | |
65 func (u *{{struct_name}}) Interface() interface{} { return u.Value } | |
66 func (u *{{struct_name}}) __Reflect(__{{union|name(exported)}}Reflect) {} | |
67 | |
68 func (u *{{struct_name}}) Encode(encoder *bindings.Encoder) error { | |
69 encoder.WriteUnionHeader(u.Tag()) | |
70 {{encode_union_field('u.Value', field.kind)|tab_indent()}} | |
71 encoder.FinishWritingUnionValue() | |
72 return nil | |
73 } | |
74 | |
75 func (u *{{struct_name}}) decodeInternal(decoder *bindings.Decoder) error { | |
76 {{decode_union_field('u.Value', field.kind)|tab_indent()}} | |
77 return nil | |
78 } | |
79 | |
80 {{runtime_type_macros.maybeWriteMojomTypeAccessor(typepkg, union, struct_name)}} | |
81 | |
82 {% endfor %} | |
83 | |
84 {% endmacro %} | |
85 | |
86 {% macro encode_union_field(value, kind) %} | |
87 {% if kind|is_union %} | |
88 if err := encoder.WritePointer(); err != nil { | |
89 return err | |
90 } | |
91 | |
92 encoder.StartNestedUnion() | |
93 {{encoding_macros.encode(value, kind)}} | |
94 encoder.Finish() | |
95 {% else %} | |
96 {{encoding_macros.encode(value, kind)}} | |
97 {% endif %} | |
98 {% endmacro %} | |
99 | |
100 {% macro decode_union_field(value, kind) %} | |
101 {% if kind|is_union %} | |
102 if pointer, err := decoder.ReadPointer(); err != nil || pointer == 0 { | |
103 if err != nil { | |
104 return err | |
105 } | |
106 {% if kind|is_nullable %} | |
107 {{value}} = nil | |
108 return nil | |
109 {% else %} | |
110 return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpe
cted null union pointer"} | |
111 {% endif %} | |
112 } | |
113 | |
114 if err := decoder.StartNestedUnion(); err != nil { | |
115 return err | |
116 } | |
117 | |
118 {{encoding_macros.decode(value, kind)}} | |
119 | |
120 decoder.Finish() | |
121 {% else %} | |
122 {{encoding_macros.decode(value, kind)}} | |
123 {% endif %} | |
124 {% endmacro %} | |
OLD | NEW |