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 36 37 38 39 40 41 42
use serde::de::{Deserialize, Deserializer, Visitor}; use std::str; #[derive(Debug, PartialEq, Eq)] pub enum Flag { IgnoreCase, } struct FlagVisitor; impl<'de> Visitor<'de> for FlagVisitor { type Value = Flag; fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!(f, "a string containing at least 10 bytes") } fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> where E: serde::de::Error, { Ok(s.parse::<Flag>().unwrap()) } } impl<'de> Deserialize<'de> for Flag { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { deserializer.deserialize_str(FlagVisitor) } } impl str::FromStr for Flag { type Err = (); fn from_str(s: &str) -> Result<Self, Self::Err> { match s { "ignore case" => Ok(Flag::IgnoreCase), _ => Err(()), } } }