| {#--- Begin #} |
| |
| {%- import "encoding_macros.tmpl" as encoding_macros %} |
| |
| {%- macro enum_def(union) %} |
| enum {{union|name}}Tag { |
| {%- for field in union.fields %} |
| {{field|tag_name}}, |
| {%- endfor %} |
| unknown |
| } |
| {%- endmacro %} |
| |
| {%- macro wrapper_def(union) %} |
| class {{union|name}} extends bindings.Union { |
| static final _tag_to_int = const { |
| {%- for field in union.fields %} |
| {{union|name}}Tag.{{field|tag_name}}: {{field.ordinal}}, |
| {%- endfor %} |
| }; |
| |
| static final _int_to_tag = const { |
| {%- for field in union.fields %} |
| {{field.ordinal}}: {{union|name}}Tag.{{field|tag_name}}, |
| {%- endfor %} |
| }; |
| |
| var _data; |
| {{union|name}}Tag _tag = {{union|name}}Tag.unknown; |
| |
| {{union|name}}Tag get tag => _tag; |
| |
| {%- for field in union.fields %} |
| {{field.kind|dart_type}} get {{field|name}} { |
| if (_tag != {{union|name}}Tag.{{field|tag_name}}) { |
| throw new bindings.UnsetUnionTagError(_tag, {{union|name}}Tag.{{field|tag_name}}); |
| } |
| return _data; |
| } |
| |
| set {{field|name}}({{field.kind|dart_type}} value) { |
| _tag = {{union|name}}Tag.{{field|tag_name}}; |
| _data = value; |
| } |
| {%- endfor %} |
| |
| static {{union|name}} decode(bindings.Decoder decoder0, int offset) { |
| int size = decoder0.decodeUint32(offset); |
| if (size == 0) { |
| return null; |
| } |
| {{union|name}} result = new {{union|name}}(); |
| |
| // TODO(azani): Handle unknown union member. |
| {{union|name}}Tag tag = _int_to_tag[decoder0.decodeUint32(offset + 4)]; |
| switch (tag) { |
| {%- for field in union.fields %} |
| case {{union|name}}Tag.{{field|tag_name}}: |
| {%- if field.kind|is_union_kind %} |
| var decoder1 = decoder0.decodePointer(offset + 8, {{field.kind|is_nullable_kind|dart_true_false}}); |
| result.{{field|name}} = {{field.kind|dart_type}}.decode(decoder1, 0); |
| {%- else %} |
| {{encoding_macros.decode('result.' ~ field|name, field.kind, "offset + 8", 0)|indent(8)}} |
| {%- endif %} |
| break; |
| {%- endfor %} |
| } |
| |
| return result; |
| } |
| |
| void encode(bindings.Encoder encoder0, int offset) { |
| // TODO(azani): Error when trying to encode an unknown member. |
| encoder0.encodeUint32(16, offset); |
| encoder0.encodeUint32(_tag_to_int[_tag], offset + 4); |
| switch (_tag) { |
| {%- for field in union.fields %} |
| case {{union|name}}Tag.{{field|tag_name}}: |
| {%- if field.kind|is_union_kind %} |
| encoder0.encodeNestedUnion({{field|name}}, offset + 8, {{field.kind|is_nullable_kind|dart_true_false}}); |
| {%- else %} |
| {{encoding_macros.encode(field|name, field.kind, "offset + 8", 0)|indent(8)}} |
| {%- endif %} |
| break; |
| {%- endfor %} |
| } |
| } |
| |
| String toString() { |
| String result = "{{union|name}}("; |
| switch (_tag) { |
| {%- for field in union.fields %} |
| case {{union|name}}Tag.{{field|tag_name}}: |
| result += "{{field|name}}"; |
| break; |
| {%- endfor %} |
| default: |
| result += "unknown"; |
| } |
| result += ": $_data)"; |
| return result; |
| } |
| } |
| {%- endmacro %} |
| |
| |
| {%- macro union_def(union) %} |
| {{enum_def(union)}} |
| {{wrapper_def(union)}} |
| {%- endmacro %} |