Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: mojo/public/tools/bindings/generators/go_templates/encoding_macros.tmpl

Issue 2250183003: Make the fuchsia mojo/public repo the source of truth. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 {% macro encode(value, kind, level=0) %}
2 {% if kind|is_nullable %}
3 if {{value}} == nil {
4 {% if kind|is_interface %}
5 encoder.WriteInvalidInterface()
6 {% elif kind|is_handle %}
7 encoder.WriteInvalidHandle()
8 {% elif kind|is_union %}
9 encoder.WriteNullUnion()
10 {% else %}
11 encoder.WriteNullPointer()
12 {% endif %}
13 } else {
14 {% if not kind|is_union %}
15 {% set value = '(*'~value~')' %}
16 {% endif %}
17 {{encodeNonNullable(value, kind, level)|tab_indent()}}
18 }
19 {% else -%}
20 {{encodeNonNullable(value, kind, level)}}
21 {%- endif %}
22 {% endmacro %}
23
24
25
26 {% macro encodeNonNullable(value, kind, level=0) %}
27 {% if kind|is_pointer %}
28 if err := encoder.WritePointer(); err != nil {
29 return err
30 }
31 {% elif kind|is_union and not kind|is_nullable %}
32 if {{value}} == nil {
33 return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpect ed null union"}
34 }
35 {% endif %}
36 {% if kind|is_struct or kind|is_union %}
37 if err := {{value}}.Encode(encoder); err != nil {
38 return err
39 }
40 {% elif kind|is_array %}
41 encoder.StartArray(uint32(len({{value}})), {{kind.kind|bit_size}})
42 for _, elem{{level}} := range {{value}} {
43 {{encode('elem'~level, kind.kind, level+1)|tab_indent()}}
44 }
45 if err := encoder.Finish(); err != nil {
46 return err
47 }
48 {% elif kind|is_map %}
49 encoder.StartMap()
50 {
51 var keys{{level}} {{kind.key_kind|array|go_type}}
52 var values{{level}} {{kind.value_kind|array|go_type}}
53 if encoder.Deterministic() {
54 for key{{level}}, _ := range {{value}} {
55 keys{{level}} = append(keys{{level}}, key{{level}})
56 }
57 bindings.SortMapKeys(&keys{{level}})
58 values{{level}} = make({{kind.value_kind|array|go_type}}, len(keys{{le vel}}))
59 for i, key := range keys{{level}} {
60 values{{level}}[i] = {{value}}[key]
61 }
62 } else {
63 for key{{level}}, value{{level}} := range {{value}} {
64 keys{{level}} = append(keys{{level}}, key{{level}})
65 values{{level}} = append(values{{level}}, value{{level}})
66 }
67 }
68 {{encode('keys'~level, kind.key_kind|array, level+1)|tab_indent()}}
69 {{encode('values'~level, kind.value_kind|array, level+1)|tab_indent()}}
70 }
71 if err := encoder.Finish(); err != nil {
72 return err
73 }
74 {% elif kind|is_enum %}
75 if err := encoder.WriteInt32(int32({{value}})); err != nil {
76 return err
77 }
78 {% elif kind|is_interface %}
79 if err := encoder.WriteInterface({{value}}.PassMessagePipe()); err != nil {
80 return err
81 }
82 {% elif kind|is_interface_request %}
83 if err := encoder.WriteHandle({{value}}.PassMessagePipe()); err != nil {
84 return err
85 }
86 {% else %}
87 if err := encoder.Write{{kind|encode_suffix}}({{value}}); err != nil {
88 return err
89 }
90 {% endif %}
91 {% endmacro %}
92
93
94
95 {% macro decode(value, kind, level=0) %}
96 {% if kind|is_pointer %}
97 pointer{{level}}, err := decoder.ReadPointer()
98 if err != nil {
99 return err
100 }
101 if pointer{{level}} == 0 {
102 {% if kind|is_nullable %}
103 {{value}} = nil
104 } else {
105 {{value}} = new({{kind|go_type(False)}})
106 {{decodePointerValue('(*'~value~')', kind, level)|tab_indent()}}
107 }
108 {% else %}
109 return &bindings.ValidationError{bindings.UnexpectedNullPointer, "unexpe cted null pointer"}
110 } else {
111 {{decodePointerValue(value, kind, level)|tab_indent()}}
112 }
113 {% endif %}
114 {% elif kind|is_union %}
115 var err error
116 {% set decoding_function = ('Decode'~ kind|unqualified_name)|qualified(kind|pa ckage) %}
117 {{value}}, err = {{decoding_function}}(decoder)
118 if err != nil {
119 return err
120 }
121 {% if not kind|is_nullable %}
122 if {{value}} == nil {
123 return &bindings.ValidationError{bindings.UnexpectedNullUnion, "unexpect ed null union"}
124 }
125 {% endif %}
126 {% elif kind|is_handle or kind|is_interface %}
127 handle{{level}}, err := decoder.Read{{kind|decode_suffix}}()
128 if err != nil {
129 return err
130 }
131 if handle{{level}}.IsValid() {
132 {% if kind|is_interface or kind|is_interface_request %}
133 handleOwner := bindings.NewMessagePipeHandleOwner(handle{{level}})
134 {{value}} = {% if kind|is_nullable %}&{% endif %}{{kind|go_type(False)}} {handleOwner}
135 {% else %}
136 {{value}} = {% if kind|is_nullable %}&{% endif %}handle{{level}}
137 {% endif %}
138 } else {
139 {% if kind|is_nullable %}
140 {{value}} = nil
141 {% else %}
142 return &bindings.ValidationError{bindings.UnexpectedInvalidHandle, "unex pected invalid handle"}
143 {% endif %}
144 }
145 {% elif kind|is_enum %}
146 value{{level}}, err := decoder.Read{{kind|decode_suffix}}()
147 if err != nil {
148 return err
149 }
150 {{value}} = {% if kind|is_nullable %}&{% endif %}{{kind|go_type(False)}}(value{{ level}})
151 {% else %}
152 value{{level}}, err := decoder.Read{{kind|decode_suffix}}()
153 if err != nil {
154 return err
155 }
156 {{value}} = {% if kind|is_nullable %}&{% endif %}value{{level}}
157 {% endif %}
158 {% endmacro %}
159
160
161
162 {% macro decodePointerValue(value, kind, level=0) %}
163 {% if kind|is_struct %}
164 if err := {{value}}.Decode(decoder); err != nil {
165 return err
166 }
167 {% elif kind|is_array %}
168 len{{level}}, err := decoder.StartArray({{kind.kind|bit_size}})
169 if err != nil {
170 return err
171 }
172 {% if kind.length %}
173 if len{{level}} != {{kind.length}} {
174 return &bindings.ValidationError{bindings.UnexpectedArrayHeader,
175 fmt.Sprintf("invalid array length: expected %d, got %d", {{kind. length}}, len{{level}}),
176 }
177 }
178 {% else %}
179 {{value}} = make({{kind|go_type(False)}}, len{{level}})
180 {% endif %}
181 for i{{level}} := uint32(0); i{{level}} < len{{level}}; i{{level}}++ {
182 {{decode(value~'[i'~level~']', kind.kind, level+1)|tab_indent()}}
183 }
184 if err := decoder.Finish(); err != nil {
185 return err
186 }
187 {% elif kind|is_map %}
188 if err := decoder.StartMap(); err != nil {
189 return err
190 }
191 var keys{{level}} {{kind.key_kind|array|go_type}}
192 {
193 {{decode('keys'~level, kind.key_kind|array, level+1)|tab_indent()}}
194 }
195 var values{{level}} {{kind.value_kind|array|go_type}}
196 {
197 {{decode('values'~level, kind.value_kind|array, level+1)|tab_indent()}}
198 }
199 if len(keys{{level}}) != len(values{{level}}) {
200 return &bindings.ValidationError{bindings.DifferentSizedArraysInMap,
201 fmt.Sprintf("Number of keys %d is different from number of value s %d", len(keys{{level}}), len(values{{level}})),
202 }
203 }
204 if err := decoder.Finish(); err != nil {
205 return err
206 }
207 len{{level}} := len(keys{{level}})
208 map{{level}} := make({{kind|go_type(False)}})
209 for i{{level}} := 0; i{{level}} < len{{level}}; i{{level}}++ {
210 map{{level}}[keys{{level}}[i{{level}}]] = values{{level}}[i{{level}}]
211 }
212 {{value}} = map{{level}}
213 {% else %}
214 value{{level}}, err := decoder.Read{{kind|decode_suffix}}()
215 if err != nil {
216 return err
217 }
218 {{value}} = value{{level}}
219 {% endif %}
220 {% endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698