{%- if f.is_message %}
type Field{{ f.number }}MessageType<'this> where Self: 'this = T::Field{{ f.number }}MessageType<'this>;
{%- endif %}

{%- if f.is_repeated %}

type Field{{ f.number }}RepeatedType<'this> where Self: 'this =
    ::std::iter::Flatten<
        ::std::option::IntoIter<
            <T::Field{{ f.number }}RepeatedType<'this> as ::std::iter::IntoIterator>::IntoIter
        >
    >;
fn {{ f.ident }}<'this>(&'this self) -> Self::Field{{ f.number }}RepeatedType<'this> {
    self.as_ref().map(|msg| msg.{{ f.ident }}().into_iter()).into_iter().flatten()
}

{%- else %} {#- if 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 }}> {
    self.as_ref().and_then(|msg| msg.{{ f.ident_unesc }}_opt())
}
{%- endif %}

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