
{%- let maybe_gp %}
{%- if has_ld_field %}
{%- if has_message_field %}
{%- let maybe_gp = "<'msg, IsOwned, T>" %}
{%- else %}
{%- let maybe_gp = "<'msg, IsOwned>" %}
{%- endif %}
{%- else %}
{%- let maybe_gp = "" %}
{%- endif %}

#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)]
pub enum {{ enum_ident }}{{ maybe_gp }}
{%- if has_ld_field %}
where
    IsOwned: ::puroro::internal::bool::BoolType,
    {%- if has_message_field %}
    T: 'msg + ?Sized + {{ owner_message_trait_path }},
    {%- endif %}
{%- else %}
{%- endif %}
{
    {%- for field in fields %}
    {{ field.ident }}({{ field.field_type }}),
    {%- endfor %}
}

impl{{ maybe_gp }} {{ enum_ident }}{{ maybe_gp }}
{%- if has_ld_field %}
where
    IsOwned: ::puroro::internal::bool::BoolType,
    {%- if has_message_field %}
    T: 'msg + ?Sized + {{ owner_message_trait_path }},
    {%- endif %}
{%- endif %}
{
    {%- for field in fields %}
    pub fn {{ field.getter_ident }}(self) -> ::std::option::Option<{{ field.field_type }}> {
        match self {
            Self::{{ field.ident }}(v) => ::std::option::Option::Some(v),
            #[allow(unreachable_patterns)]
            _ => None,
        }
    }
    {%- endfor %}
}

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

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

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

