Нужно десериализовать числа в enum. В документации Serde я нашёл пример макроса
для этой задачи, но у меня пока не получается им воспользоваться: Serialize enum as number.
Кто-нибудь может подсказать, как исправить ошибку?
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);
}