#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)]
pub enum {{ enum_ident }}
{%- if has_reference_field %}
<'msg, T: 'msg + ?Sized + {{ owner_message_trait_path }}>
{%- else %}
{%- endif %}
{
    {%- for field in fields %}
    {{ field.ident }}({{ field.trait_field_type }}),
    {%- endfor %}
}


{%- if has_reference_field %}
impl <'msg, T: 'msg + ?Sized + {{ owner_message_trait_path }}> {{ enum_ident }}<'msg, T>
{%- else %}
impl {{ enum_ident }}
{%- endif %}
{
    {%- for field in fields %}
    pub fn {{ field.getter_ident }}(self) -> ::std::option::Option<{{ field.trait_field_type }}> {
        match self {
            Self::{{ field.ident }}(v) => ::std::option::Option::Some(v),
            #[allow(unreachable_patterns)]
            _ => None,
        }
    }
    {%- endfor %}
}

{%- if has_reference_field %}
impl<'msg, T> ::std::convert::From<{{ enum_ident }}<'msg, T>>
for {{ enum_ident }}<'msg, &'_ T>
where
    T: 'msg + {{ owner_message_trait_path }},
{
    fn from(value: {{ enum_ident }}<'msg, T>) -> Self {
        match value {
            {%- for field in fields %}
            {{ enum_ident }}::{{ field.ident }}(v) => {{ enum_ident }}::{{ field.ident }}(v),
            {%- endfor %}
        }
    }
}
{%- endif %}

{%- if has_reference_field %}
impl<'msg, T> ::std::convert::From<{{ enum_ident }}<'msg, T>>
for {{ enum_ident }}<'msg, &'_ mut T>
where
    T: 'msg + {{ owner_message_trait_path }},
{
    fn from(value: {{ enum_ident }}<'msg, T>) -> Self {
        match value {
            {%- for field in fields %}
            {{ enum_ident }}::{{ field.ident }}(v) => {{ enum_ident }}::{{ field.ident }}(v),
            {%- endfor %}
        }
    }
}
{%- endif %}

{%- if has_reference_field %}
impl<'msg, T> ::std::convert::From<{{ enum_ident }}<'msg, T>>
for {{ enum_ident }}<'msg, ::std::boxed::Box<T>>
where
    T: 'msg + {{ owner_message_trait_path }},
{
    fn from(value: {{ enum_ident }}<'msg, T>) -> Self {
        match value {
            {%- for field in fields %}
            {{ enum_ident }}::{{ field.ident }}(v) => {{ enum_ident }}::{{ field.ident }}(v),
            {%- endfor %}
        }
    }
}
{%- endif %}

