
export interface {{ident}} {
{%- if self.is_tuple() -%}
  {% for (id, ty) in fields %}
  {{ loop.index - 1 }}: {{ ty.ts_type() }};
  {%- endfor %} 
{%- else -%}
  {% for (id, ty) in fields %}
  {{ id.clone().unwrap() }}: {{ ty.ts_type() }};
  {%- endfor %} 
{%- endif %}
}

export function write{{ident}}(value: {{ident}}, sinkOrBuf?: SinkOrBuf): Sink {
  const sink = Sink.create(sinkOrBuf);
{%- for (id, ty) in fields -%}
  {%- match id -%}
    {%- when Some with (id) %}
  {{ ty.writer() }}(value.{{id}}, sink);
    {%- when None %}
  {{ ty.writer() }}(value[{{loop.index - 1}}], sink);
  {%- endmatch%}
{%- endfor %} 
  return sink;
}

export function read{{ident}}(sinkOrBuf: SinkOrBuf): {{ident}} {
  const sink = Sink.create(sinkOrBuf);
  {% if self.is_tuple() -%}
  return [
    {%- for (id, ty) in fields %}
    {{ ty.reader() }}(sink),
    {%- endfor %} 
  ];
  {%- else -%}
  return {
    {%- for (id, ty) in fields %}
    {{id.clone().unwrap()}}: {{ ty.reader() }}(sink),
    {%- endfor %} 
  };
  {%- endif %}
}
