
#[derive(Debug, Clone, PartialEq)]
pub enum {{ ident_enum }} {
    {%- for value in values %}
    {{ value.ident_enum_item }},
    {%- endfor %} {#- for value in values #}
    {%- match syntax %}
    {%- when Syntax::Proto3 %}
    _None(i32),
    {%- else %}
    {%- endmatch %} 
}

impl ::std::default::Default for {{ ident_enum }} {
    fn default() -> Self {
        {{ ident_enum }}::{{ values[0].ident_enum_item }}
    }
}

{%- match syntax %}
{%- when Syntax::Proto2 %}

impl ::std::convert::TryFrom<i32> for {{ ident_enum }} {
    type Error = self::_puroro::PuroroError;
    fn try_from(x: i32) -> ::std::result::Result<Self, Self::Error> {
        #[allow(unused)]
        use ::std::result::Result::{Ok, Err};
        match x {
            {%- for value in values %}
            {{ value.number }} => Ok(self::{{ ident_enum }}::{{ value.ident_enum_item }}),
            {%- endfor %} {#- for value in values #}
            e => Err(self::_puroro::ErrorKind::UnknownEnumVariant(e))?,
        }
    }
}

impl ::std::convert::From<{{ ident_enum }}> for i32 {
    fn from(x: {{ ident_enum }}) -> i32 {
        match x {
            {%- for value in values %}
            self::{{ ident_enum }}::{{ value.ident_enum_item }} => {{ value.number }},
            {%- endfor %} {#- for value in values #}
        }
    }
}

{%- when Syntax::Proto3 %}

impl ::std::convert::From<i32> for {{ ident_enum }} {
    fn from(x: i32) -> Self {
        match x {
            {%- for value in values %}
            {{ value.number }} => self::{{ ident_enum }}::{{ value.ident_enum_item }},
            {%- endfor %} {#- for value in values #}
            e => self::{{ ident_enum }}::_None(e),
        }
    }
}

impl ::std::convert::From<{{ ident_enum }}> for i32 {
    fn from(x: {{ ident_enum }}) -> i32 {
        match x {
            {%- for value in values %}
            self::{{ ident_enum }}::{{ value.ident_enum_item }} => {{ value.number }},
            {%- endfor %} {#- for value in values #}
            self::{{ ident_enum }}::_None(y) => y,
        }
    }
}

{%- else %}
{%- endmatch %} {#- match syntax #}