OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 {% macro define(struct, exported=True) %} | 5 {% macro define(struct, exported=True) %} |
6 type {{struct|name(exported)}} struct { | 6 type {{struct|name(exported)}} struct { |
7 {% for field in struct.fields %} | 7 {% for field in struct.fields %} |
8 {{field|name(exported)}} {{field.kind|go_type}} | 8 {{field|name(exported)}} {{field.kind|go_type}} |
9 {% endfor %} | 9 {% endfor %} |
10 } | 10 } |
11 | 11 |
12 func (s *{{struct|name(exported)}}) Encode(encoder *bindings.Encoder) error { | 12 func (s *{{struct|name(exported)}}) Encode(encoder *bindings.Encoder) error { |
13 {% set HEADER_SIZE = 8 %} | 13 {% set HEADER_SIZE = 8 %} |
14 encoder.StartStruct({{struct.versions[-1].num_bytes - HEADER_SIZE}}, {{s
truct.versions[-1].version}}) | 14 encoder.StartStruct({{struct.versions[-1].num_bytes - HEADER_SIZE}}, {{s
truct.versions[-1].version}}) |
15 {% for byte in struct.bytes %} | 15 {% for byte in struct.bytes %} |
16 {% for packed_field in byte.packed_fields %} | 16 {% for packed_field in byte.packed_fields %} |
17 {{encode('s.'~packed_field.field|name(exported), packed_field.field.kind
)|tab_indent()}} | 17 {{encode('s.'~packed_field.field|name(exported), packed_field.field.kind
)|tab_indent()}} |
18 {% endfor %} | 18 {% endfor %} |
19 {% endfor %} | 19 {% endfor %} |
20 if err := encoder.Finish(); err != nil { | 20 if err := encoder.Finish(); err != nil { |
21 return err | 21 return err |
22 } | 22 } |
23 return nil | 23 return nil |
24 } | 24 } |
25 | 25 |
| 26 var {{struct|name(False)}}_Versions []bindings.DataHeader = []bindings.DataHeade
r{ |
| 27 {% for versionInfo in struct.versions %} |
| 28 bindings.DataHeader{{'{'}}{{versionInfo.num_bytes}}, {{versionInfo.versi
on}}{{'}'}}, |
| 29 {% endfor %} |
| 30 } |
| 31 |
26 func (s *{{struct|name(exported)}}) Decode(decoder *bindings.Decoder) error { | 32 func (s *{{struct|name(exported)}}) Decode(decoder *bindings.Decoder) error { |
27 {% if struct.bytes %} | 33 » header, err := decoder.StartStruct() |
28 » version, err := decoder.StartStruct() | |
29 {% else %} | |
30 » _, err := decoder.StartStruct() | |
31 {% endif %} | |
32 if err != nil { | 34 if err != nil { |
33 return err | 35 return err |
34 } | 36 } |
| 37 index := sort.Search(len({{struct|name(False)}}_Versions), func(i int) b
ool { |
| 38 return {{struct|name(False)}}_Versions[i].ElementsOrVersion >= h
eader.ElementsOrVersion |
| 39 }) |
| 40 if index < len({{struct|name(False)}}_Versions) { |
| 41 if {{struct|name(False)}}_Versions[index].ElementsOrVersion > he
ader.ElementsOrVersion { |
| 42 index-- |
| 43 } |
| 44 expectedSize := {{struct|name(False)}}_Versions[index].Size |
| 45 if expectedSize != header.Size { |
| 46 return fmt.Errorf("invalid struct header size: should be
%d, but was %d", expectedSize, header.Size) |
| 47 } |
| 48 } |
35 {% for byte in struct.bytes %} | 49 {% for byte in struct.bytes %} |
36 {% for packed_field in byte.packed_fields %} | 50 {% for packed_field in byte.packed_fields %} |
37 » if version >= {{packed_field.min_version}} { | 51 » if header.ElementsOrVersion >= {{packed_field.min_version}} { |
38 {{decode('s.'~packed_field.field|name(exported), packed_field.fi
eld.kind)|tab_indent(2)}} | 52 {{decode('s.'~packed_field.field|name(exported), packed_field.fi
eld.kind)|tab_indent(2)}} |
39 } | 53 } |
40 {% endfor %} | 54 {% endfor %} |
41 {% endfor %} | 55 {% endfor %} |
42 if err := decoder.Finish(); err != nil { | 56 if err := decoder.Finish(); err != nil { |
43 return err | 57 return err |
44 } | 58 } |
45 return nil | 59 return nil |
46 } | 60 } |
47 | 61 |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 } | 234 } |
221 {{value}} = map{{level}} | 235 {{value}} = map{{level}} |
222 {% else %} | 236 {% else %} |
223 value{{level}}, err := decoder.Read{{kind|decode_suffix}}() | 237 value{{level}}, err := decoder.Read{{kind|decode_suffix}}() |
224 if err != nil { | 238 if err != nil { |
225 return err | 239 return err |
226 } | 240 } |
227 {{value}} = value{{level}} | 241 {{value}} = value{{level}} |
228 {% endif %} | 242 {% endif %} |
229 {% endmacro %} | 243 {% endmacro %} |
OLD | NEW |