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