impl<T, U> {{ m.trait_ident }} for (T, U)
where
    T: {{ m.trait_ident }},
    U: {{ m.trait_ident }},
{
    {%- for field in m.fields %}
    {%- call merged_trait_impl_field(field) %}
    {%- endfor %}

    {%- for oneof in m.oneofs %}
    fn {{ oneof.field_ident }}<'this>(&'this self) ->
        Option<
            super::_puroro_nested::{{ m.submodule_ident }}::_puroro_oneofs::{{ oneof.enum_ident }}
            {%- if oneof.has_reference_field %}
            <'this, Self>
            {%- endif %}
        >
    {
        use super::_puroro_nested::{{ m.submodule_ident }}::_puroro_oneofs::{{ oneof.enum_ident }} as E;
        Some(match (self.0.{{ oneof.field_ident }}(), self.1.{{ oneof.field_ident }}()) {
            (None, None) => { return None; },

            {%- for field in oneof.fields %}
            (
                Some(E::{{ field.ident }}({% if field.is_message %}left{% else %}_{% endif %})),
                Some(E::{{ field.ident }}(right))
            ) => {
                {%- if field.is_length_delimited %}
                {%- if field.is_message %}
                E::{{ field.ident }}((Some(left), Some(right)))
                {%- else %}
                E::{{ field.ident }}(::puroro::Either::Right(right))
                {%- endif %}
                {%- else %}
                E::{{ field.ident }}(right)
                {%- endif %}
            }
            {%- endfor %}

            {%- for field in oneof.fields %}
            (_, Some(E::{{ field.ident }}(right))) => {
                {%- if field.is_length_delimited %}
                {%- if field.is_message %}
                E::{{ field.ident }}((None, Some(right)))
                {%- else %}
                E::{{ field.ident }}(::puroro::Either::Right(right))
                {%- endif %}
                {%- else %}
                E::{{ field.ident }}(right)
                {%- endif %}
            }
            {%- endfor %}

            {%- for field in oneof.fields %}
            (Some(E::{{ field.ident }}(left)), None) => {
                {%- if field.is_length_delimited %}
                {%- if field.is_message %}
                E::{{ field.ident }}((Some(left), None))
                {%- else %}
                E::{{ field.ident }}(::puroro::Either::Left(left))
                {%- endif %}
                {%- else %}
                E::{{ field.ident }}(left)
                {%- endif %}
            }
            {%- endfor %}
        })
    }
    {%- endfor %}
}