blob: 511201eb30da382ae42d4f2506a3ab71108972fa [file] [log] [blame]
{#--- 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 %}