summaryrefslogtreecommitdiff
path: root/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
blob: cde3f95669369fad483f82f05dd8142acc45fef1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{%- 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;
}