
{%- match f.simple_maybe_field_message_path %}
{%- when Some with (struct_path) %}
type Field{{ f.number }}MessageType<'this> where Self: 'this = &'this {{ struct_path }};
{%- else %}
{%- endmatch %}

{%- if f.is_repeated %}

{%- match f.simple_maybe_borrowed_field_type %}
{%- when Some with (borrowed) %}
type Field{{ f.number }}RepeatedType<'this> = ::puroro::internal::impls::simple::BorrowedIter<
    {{ borrowed }},
    ::std::slice::Iter<'this, {{ f.simple_scalar_field_type }}>>;
{%- else %}
type Field{{ f.number }}RepeatedType<'this> = ::std::iter::Cloned<::std::slice::Iter<'this, {{ f.trait_scalar_getter_type }}>>;
{%- endmatch %}

fn {{ f.ident }}<'this>(&'this self) -> Self::Field{{ f.number }}RepeatedType<'this> {
    {%- match f.simple_maybe_borrowed_field_type %}
    {%- when Some with (borrowed) %}
    ::puroro::internal::impls::simple::BorrowedIter::new(self.{{ f.ident }}.iter())
    {%- else %}
    self.{{ f.ident }}.iter().cloned()
    {%- endmatch %}
}

{%- else %} {#- if f.is_repeated #}

{%- if !f.is_explicit_oneof_field %}
fn {{ f.ident_unesc }}_opt<'this>(&'this self) -> Option<{{ f.trait_scalar_getter_type }}> {
    {%- if f.is_unlabeled %}

    {%- if f.is_length_delimited %}
    {%- if f.is_message %}
    {#- Message, the field type is Option<T> #}
    self.{{ f.ident }}.as_ref().map(|v| v.as_ref())
    {%- else %}
    {#- String / Bytes, the field type is T #}
    if self.{{ f.ident }}.is_empty() {
        ::std::option::Option::None
    } else {
        ::std::option::Option::Some(self.{{ f.ident }}.as_ref())
    }
    {%- endif %}
    {%- else %}
    {#- Numerical types, the field type is T #}
    if self.{{ f.ident }} == ::std::default::Default::default() {
        ::std::option::Option::None
    } else {
        ::std::option::Option::Some(self.{{ f.ident }}.clone())
    }
    {%- endif %}

    {%- else %} {#- if f.is_unlabeled #}

    {#- The field type is Option<T> #}
    {%- if f.is_length_delimited %}
    self.{{ f.ident }}.as_ref().map(|v| v.as_ref())
    {%- else %}
    Clone::clone(&self.{{ f.ident }})
    {%- endif %}

    {%- endif %} {#- if f.is_unlabeled #}
}
{%- endif %} {#- if !f.is_explicit_oneof_field #}

{%- endif %} {#- if f.is_repeated #}
