1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use crate::LeaderKind; use serde::{de, Deserialize, Deserializer}; use std::fmt; impl<'de> Deserialize<'de> for LeaderKind { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { struct LeaderKindVisitor; impl<'de> de::Visitor<'de> for LeaderKindVisitor { type Value = LeaderKind; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a string containing leader type") } fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where E: de::Error, { match v { "admiral" => Ok(LeaderKind::Admiral), "general" => Ok(LeaderKind::General), "conquistador" => Ok(LeaderKind::Conquistador), "explorer" => Ok(LeaderKind::Explorer), _ => Err(de::Error::custom(format!("unknown leader key: {}", &v))), } } } deserializer.deserialize_any(LeaderKindVisitor) } }