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

{%- if f.is_repeated %}

{%- if f.is_length_delimited %}
{%- if f.is_message %}
type Field{{ f.number }}RepeatedType<'this> where Self: 'this
    = <&'this RepeatedType as ::std::iter::IntoIterator>::IntoIter;
{%- else %}
type Field{{ f.number }}RepeatedType<'this> where Self: 'this
    = ::puroro::internal::impls::single_field::AsRefIter<
        <&'this RepeatedType as ::std::iter::IntoIterator>::IntoIter,
        {%- if f.is_bytes %}
        [u8],
        {%- endif %}
        {%- if f.is_string %}
        str,
        {%- endif %}
    >;
{%- endif %}
{%- else %}
type Field{{ f.number }}RepeatedType<'this> where Self: 'this
    = ::puroro::internal::impls::single_field::CloneThenIntoIter<
        <&'this RepeatedType as ::std::iter::IntoIterator>::IntoIter,
        {{ field.single_numerical_rust_type }}
    >;
{%- endif %}

fn {{ f.ident }}<'this>(&'this self) -> Self::Field{{ f.number }}RepeatedType<'this> {
    {%- if f.is_length_delimited %}
    {%- if f.is_message %}
    ::std::iter::IntoIterator::into_iter(&self.{{ f.ident }})
    {%- else %}
    ::puroro::internal::impls::single_field::AsRefIter::new(
        ::std::iter::IntoIterator::into_iter(&self.{{ f.ident }})
    )
    {%- endif %}
    {%- else %}
    ::puroro::internal::impls::single_field::CloneThenIntoIter::new(
        ::std::iter::IntoIterator::into_iter(&self.{{ f.ident }})
    )
    {%- endif %}
}

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

{%- if !f.is_explicit_oneof_field %}

fn {{ f.ident_unesc }}_opt<'this>(&'this self) -> ::std::option::Option<{{ f.trait_scalar_getter_type }}> {
    {%- if f.is_length_delimited %}
    {%- if f.is_message %}
    ::std::option::Option::Some(&self.{{ f.ident }})
    {%- else %}
    ::std::option::Option::Some(self.{{ f.ident }}.as_ref())
    {%- endif %}
    {%- else %}
    ::std::option::Option::Some(
        ::std::convert::Into::into(::std::clone::Clone::clone(&self.{{ f.ident }}))
    )
    {%- endif %}
}

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

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