{%- set mojom_type = struct|get_qualified_name_for_kind %}

template <>
struct {{export_attribute}} StructTraits<{{mojom_type}}::DataView,
                                         {{mojom_type}}Ptr> {
  static bool IsNull(const {{mojom_type}}Ptr& input) { return !input; }
  static void SetToNull({{mojom_type}}Ptr* output) { output->reset(); }

{%- for field in struct.fields %}
{%-   set return_ref = field.kind|is_object_kind or
  field.kind|is_any_handle_or_interface_kind %}
{#    We want the field accessor to be const whenever possible to allow
      structs to be used as map keys.
      TODO(tibell): Make this check more precise to deal with e.g.
          custom types which don't contain handles but require non-const
          reference for serialization. #}
{%-   set maybe_const = "" if field.kind|contains_handles_or_interfaces else "const" %}
{%-   if return_ref %}
  static {{maybe_const}} decltype({{mojom_type}}::{{field.name}})& {{field.name}}(
      {{maybe_const}} {{mojom_type}}Ptr& input) {
    return input->{{field.name}};
  }
{%-   else %}
  static decltype({{mojom_type}}::{{field.name}}) {{field.name}}(
      const {{mojom_type}}Ptr& input) {
    return input->{{field.name}};
  }
{%-   endif %}
{%- endfor %}

  static bool Read({{mojom_type}}::DataView input, {{mojom_type}}Ptr* output);
};
