1 use serde::{Deserialize, Deserializer}; 2 3 #[derive(Debug, Clone, Copy, PartialEq, Eq)] 4 pub enum FsType { 5 Fat32, 6 } 7 8 impl<'de> Deserialize<'de> for FsType { 9 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 10 where 11 D: Deserializer<'de>, 12 { 13 let mut s = String::deserialize(deserializer)?; 14 s.make_ascii_lowercase(); 15 match s.as_str() { 16 "fat32" => Ok(FsType::Fat32), 17 _ => Err(serde::de::Error::custom("invalid fs type")), 18 } 19 } 20 } 21 22 #[cfg(test)] 23 mod tests { 24 use super::*; 25 use serde_json::{self, Value}; 26 27 fn deserialize_fs_type(input: &str) -> Result<FsType, serde_json::Error> { 28 let json = Value::String(input.to_string()); 29 serde_json::from_value(json) 30 } 31 32 #[test] 33 fn test_deserialize_fat32_lowercase() { 34 let r = deserialize_fs_type("fat32"); 35 assert_eq!(r.is_ok(), true); 36 let fs_type = r.unwrap(); 37 assert_eq!(fs_type, FsType::Fat32); 38 } 39 40 #[test] 41 fn test_deserialize_fat32_mixed_case() { 42 let r = deserialize_fs_type("FAT32"); 43 assert_eq!(r.is_ok(), true); 44 let fs_type = r.unwrap(); 45 assert_eq!(fs_type, FsType::Fat32); 46 } 47 48 #[test] 49 fn testdeserialize_random_string() { 50 assert!(deserialize_fs_type("abc123").is_err()); 51 } 52 } 53