blob: cde3f95669369fad483f82f05dd8142acc45fef1 [file] [log] [blame]
{%- set mojom_type = union|get_qualified_name_for_kind %}
// static
bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read(
{{mojom_type}}::DataView input,
{{mojom_type}}Ptr* output) {
*output = {{mojom_type}}::New();
{{mojom_type}}Ptr& result = *output;
internal::UnionAccessor<{{mojom_type}}> result_acc(result.get());
switch (input.tag()) {
{%- for field in union.fields %}
case {{mojom_type}}::Tag::{{field.name|upper}}: {
{%- set name = field.name %}
{%- set kind = field.kind %}
{%- set serializer_type = kind|unmapped_type_for_serializer %}
{%- if kind|is_object_kind %}
result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}});
if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}}))
return false;
{%- elif kind|is_any_handle_kind %}
auto result_{{name}} = input.Take{{name|under_to_camel}}();
result->set_{{name}}(std::move(result_{{name}}));
{%- elif kind|is_any_interface_kind %}
auto result_{{name}} =
input.Take{{name|under_to_camel}}<typename std::remove_reference<decltype(result->get_{{name}}())>::type>();
result->set_{{name}}(std::move(result_{{name}}));
{%- elif kind|is_enum_kind %}
decltype(result->get_{{name}}()) result_{{name}};
if (!input.Read{{name|under_to_camel}}(&result_{{name}}))
return false;
result->set_{{name}}(result_{{name}});
{%- else %}
result->set_{{name}}(input.{{name}}());
{%- endif %}
break;
}
{%- endfor %}
default:
return false;
}
return true;
}