{%- if f.is_bytes %}
type Field{{ f.number }}BytesType<'this> where Self: 'this = &'static [u8];
{%- endif %}
{%- if f.is_string %}
type Field{{ f.number }}StringType<'this> where Self: 'this = &'static str;
{%- endif %}
{%- if f.is_message %}
type Field{{ f.number }}MessageType<'this> where Self: 'this = ();
{%- endif %}

{%- if f.trait_has_scalar_getter %}
fn {{ f.ident }}<'this>(&'this self) -> {{ f.trait_scalar_getter_type }} {
    {%- if f.is_bytes %}
    &[]
    {%- endif %}
    {%- if f.is_string %}
    ""
    {%- endif %}
    {#- No need to consider message type case here, message is always wrapped by Optional -#}
    {%- if !f.is_length_delimited %}
    Default::default()
    {%- endif %}
}
{%- endif %}

{%- if f.trait_has_repeated_getter %}
type Field{{ f.number }}RepeatedType<'this> where Self: 'this = ::puroro::internal::impls::empty::EmptyRepeatedField<{{ f.trait_scalar_getter_type }}>;
fn {{ f.ident }}<'this>(&'this self) -> Self::Field{{ f.number }}RepeatedType<'this> {
    ::puroro::internal::impls::empty::EmptyRepeatedField::new()
}
{%- endif %}