{%- if f.is_bytes %}
type Field{{ f.number }}BytesType<'this> where Self: 'this = &'this [u8];
{%- endif %}
{%- if f.is_string %}
type Field{{ f.number }}StringType<'this> where Self: 'this = &'this str;
{%- endif %}
{%- 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.trait_has_scalar_getter %}
fn {{ f.ident }}<'this>(&'this self) -> {{ f.trait_scalar_getter_type }} {
    {%- if f.is_length_delimited %}
    self.{{ f.ident }}.deref()
    {%- else %}
    Clone::clone(&self.{{ f.ident }})
    {%- endif %}
}
{%- endif %}

{%- if f.trait_has_optional_getter && !f.is_explicit_oneof_field %}
fn {{ f.ident }}<'this>(&'this self) -> Option<{{ f.trait_scalar_getter_type }}> {
    {%- if f.is_length_delimited %}
    {%- if f.is_message %}
    self.{{ f.ident }}.as_ref()
    {%- else %}
    self.{{ f.ident }}.as_deref()
    {%- endif %}
    {%- else %}
    Clone::clone(&self.{{ f.ident }})
    {%- endif %}
}
{%- endif %}

{%- if f.trait_has_repeated_getter %}
{%- 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::DerefIter<
        <&'this RepeatedType as ::std::iter::IntoIterator>::IntoIter
    >;
{%- endif %}
{%- else %}
type Field{{ f.number }}RepeatedType<'this> where Self: 'this
    = ::std::iter::Cloned<<&'this RepeatedType as ::std::iter::IntoIterator>::IntoIter>;
{%- 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::DerefIter::new(
        ::std::iter::IntoIterator::into_iter(&self.{{ f.ident }})
    )
    {%- endif %}
    {%- else %}
    ::std::iter::Iterator::cloned(::std::iter::IntoIterator::into_iter(&self.{{ f.ident }}))
    {%- endif %}
}
{%- endif %}