{%- 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}}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; }