[Решено] Десериализация чисел в enum

Нужно десериализовать числа в enum. В документации Serde я нашёл пример макроса
для этой задачи, но у меня пока не получается им воспользоваться: Serialize enum as number.
Кто-нибудь может подсказать, как исправить ошибку?

play.integer32.com

extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;

use std::fmt;

macro_rules! enum_number_de {
    ($name:ident { $($variant:ident = $value:expr, )* }) => {
        #[derive(Debug, Clone, Copy)]
        pub enum $name {
            $($variant = $value,)*
        }

        impl ::serde::Deserialize for $name {
            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
                where D: ::serde::Deserializer
            {
                struct Visitor;
                
                impl ::serde::de::Visitor for Visitor {
                    type Value = $name;

                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
                        formatter.write_str("positive integer")
                    }

                    fn visit_u8<E>(self, value: u8) -> Result<$name, E>
                        where E: ::serde::de::Error
                    {
                        match value {
                            $( $value => Ok($name::$variant), )*
                            _ => Err(E::custom(
                                format!("unknown {} value: {}",
                                stringify!($name), value))),
                        }
                    }
                }
                deserializer.deserialize_u8(Visitor)
            }
        }
    }
}

enum_number_de!(Error {
    Ok = 0,
    Warning = 1,
    Error = 2,
});

#[derive(Debug,Clone,Deserialize)]
struct ResponseGet {
    error: Error,
}

fn main() {
    let input_json = r#"{"error":0}"#;
    let resp = serde_json::from_str::<ResponseGet>(input_json).unwrap();
    println!("{:?}", resp);
}

Поменяйте везде u8 на u64 как в примере и все заработает.

Спасибо :slight_smile:
Хотя почему нельзя u8 мне не понятно.