12d8ae3abSopenharmony_ci#![cfg(feature = "serde")] 22d8ae3abSopenharmony_ci 32d8ae3abSopenharmony_ciextern crate serde; 42d8ae3abSopenharmony_ciuse self::serde::de::{ 52d8ae3abSopenharmony_ci Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error, Unexpected, VariantAccess, 62d8ae3abSopenharmony_ci Visitor, 72d8ae3abSopenharmony_ci}; 82d8ae3abSopenharmony_ciuse self::serde::ser::{Serialize, Serializer}; 92d8ae3abSopenharmony_ci 102d8ae3abSopenharmony_ciuse {Level, LevelFilter, LOG_LEVEL_NAMES}; 112d8ae3abSopenharmony_ci 122d8ae3abSopenharmony_ciuse std::fmt; 132d8ae3abSopenharmony_ciuse std::str::{self, FromStr}; 142d8ae3abSopenharmony_ci 152d8ae3abSopenharmony_ci// The Deserialize impls are handwritten to be case insensitive using FromStr. 162d8ae3abSopenharmony_ci 172d8ae3abSopenharmony_ciimpl Serialize for Level { 182d8ae3abSopenharmony_ci fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 192d8ae3abSopenharmony_ci where 202d8ae3abSopenharmony_ci S: Serializer, 212d8ae3abSopenharmony_ci { 222d8ae3abSopenharmony_ci match *self { 232d8ae3abSopenharmony_ci Level::Error => serializer.serialize_unit_variant("Level", 0, "ERROR"), 242d8ae3abSopenharmony_ci Level::Warn => serializer.serialize_unit_variant("Level", 1, "WARN"), 252d8ae3abSopenharmony_ci Level::Info => serializer.serialize_unit_variant("Level", 2, "INFO"), 262d8ae3abSopenharmony_ci Level::Debug => serializer.serialize_unit_variant("Level", 3, "DEBUG"), 272d8ae3abSopenharmony_ci Level::Trace => serializer.serialize_unit_variant("Level", 4, "TRACE"), 282d8ae3abSopenharmony_ci } 292d8ae3abSopenharmony_ci } 302d8ae3abSopenharmony_ci} 312d8ae3abSopenharmony_ci 322d8ae3abSopenharmony_ciimpl<'de> Deserialize<'de> for Level { 332d8ae3abSopenharmony_ci fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 342d8ae3abSopenharmony_ci where 352d8ae3abSopenharmony_ci D: Deserializer<'de>, 362d8ae3abSopenharmony_ci { 372d8ae3abSopenharmony_ci struct LevelIdentifier; 382d8ae3abSopenharmony_ci 392d8ae3abSopenharmony_ci impl<'de> Visitor<'de> for LevelIdentifier { 402d8ae3abSopenharmony_ci type Value = Level; 412d8ae3abSopenharmony_ci 422d8ae3abSopenharmony_ci fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 432d8ae3abSopenharmony_ci formatter.write_str("log level") 442d8ae3abSopenharmony_ci } 452d8ae3abSopenharmony_ci 462d8ae3abSopenharmony_ci fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> 472d8ae3abSopenharmony_ci where 482d8ae3abSopenharmony_ci E: Error, 492d8ae3abSopenharmony_ci { 502d8ae3abSopenharmony_ci // Case insensitive. 512d8ae3abSopenharmony_ci FromStr::from_str(s).map_err(|_| Error::unknown_variant(s, &LOG_LEVEL_NAMES[1..])) 522d8ae3abSopenharmony_ci } 532d8ae3abSopenharmony_ci 542d8ae3abSopenharmony_ci fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> 552d8ae3abSopenharmony_ci where 562d8ae3abSopenharmony_ci E: Error, 572d8ae3abSopenharmony_ci { 582d8ae3abSopenharmony_ci let variant = str::from_utf8(value) 592d8ae3abSopenharmony_ci .map_err(|_| Error::invalid_value(Unexpected::Bytes(value), &self))?; 602d8ae3abSopenharmony_ci 612d8ae3abSopenharmony_ci self.visit_str(variant) 622d8ae3abSopenharmony_ci } 632d8ae3abSopenharmony_ci 642d8ae3abSopenharmony_ci fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E> 652d8ae3abSopenharmony_ci where 662d8ae3abSopenharmony_ci E: Error, 672d8ae3abSopenharmony_ci { 682d8ae3abSopenharmony_ci let variant = LOG_LEVEL_NAMES[1..] 692d8ae3abSopenharmony_ci .get(v as usize) 702d8ae3abSopenharmony_ci .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; 712d8ae3abSopenharmony_ci 722d8ae3abSopenharmony_ci self.visit_str(variant) 732d8ae3abSopenharmony_ci } 742d8ae3abSopenharmony_ci } 752d8ae3abSopenharmony_ci 762d8ae3abSopenharmony_ci impl<'de> DeserializeSeed<'de> for LevelIdentifier { 772d8ae3abSopenharmony_ci type Value = Level; 782d8ae3abSopenharmony_ci 792d8ae3abSopenharmony_ci fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 802d8ae3abSopenharmony_ci where 812d8ae3abSopenharmony_ci D: Deserializer<'de>, 822d8ae3abSopenharmony_ci { 832d8ae3abSopenharmony_ci deserializer.deserialize_identifier(LevelIdentifier) 842d8ae3abSopenharmony_ci } 852d8ae3abSopenharmony_ci } 862d8ae3abSopenharmony_ci 872d8ae3abSopenharmony_ci struct LevelEnum; 882d8ae3abSopenharmony_ci 892d8ae3abSopenharmony_ci impl<'de> Visitor<'de> for LevelEnum { 902d8ae3abSopenharmony_ci type Value = Level; 912d8ae3abSopenharmony_ci 922d8ae3abSopenharmony_ci fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 932d8ae3abSopenharmony_ci formatter.write_str("log level") 942d8ae3abSopenharmony_ci } 952d8ae3abSopenharmony_ci 962d8ae3abSopenharmony_ci fn visit_enum<A>(self, value: A) -> Result<Self::Value, A::Error> 972d8ae3abSopenharmony_ci where 982d8ae3abSopenharmony_ci A: EnumAccess<'de>, 992d8ae3abSopenharmony_ci { 1002d8ae3abSopenharmony_ci let (level, variant) = value.variant_seed(LevelIdentifier)?; 1012d8ae3abSopenharmony_ci // Every variant is a unit variant. 1022d8ae3abSopenharmony_ci variant.unit_variant()?; 1032d8ae3abSopenharmony_ci Ok(level) 1042d8ae3abSopenharmony_ci } 1052d8ae3abSopenharmony_ci } 1062d8ae3abSopenharmony_ci 1072d8ae3abSopenharmony_ci deserializer.deserialize_enum("Level", &LOG_LEVEL_NAMES[1..], LevelEnum) 1082d8ae3abSopenharmony_ci } 1092d8ae3abSopenharmony_ci} 1102d8ae3abSopenharmony_ci 1112d8ae3abSopenharmony_ciimpl Serialize for LevelFilter { 1122d8ae3abSopenharmony_ci fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 1132d8ae3abSopenharmony_ci where 1142d8ae3abSopenharmony_ci S: Serializer, 1152d8ae3abSopenharmony_ci { 1162d8ae3abSopenharmony_ci match *self { 1172d8ae3abSopenharmony_ci LevelFilter::Off => serializer.serialize_unit_variant("LevelFilter", 0, "OFF"), 1182d8ae3abSopenharmony_ci LevelFilter::Error => serializer.serialize_unit_variant("LevelFilter", 1, "ERROR"), 1192d8ae3abSopenharmony_ci LevelFilter::Warn => serializer.serialize_unit_variant("LevelFilter", 2, "WARN"), 1202d8ae3abSopenharmony_ci LevelFilter::Info => serializer.serialize_unit_variant("LevelFilter", 3, "INFO"), 1212d8ae3abSopenharmony_ci LevelFilter::Debug => serializer.serialize_unit_variant("LevelFilter", 4, "DEBUG"), 1222d8ae3abSopenharmony_ci LevelFilter::Trace => serializer.serialize_unit_variant("LevelFilter", 5, "TRACE"), 1232d8ae3abSopenharmony_ci } 1242d8ae3abSopenharmony_ci } 1252d8ae3abSopenharmony_ci} 1262d8ae3abSopenharmony_ci 1272d8ae3abSopenharmony_ciimpl<'de> Deserialize<'de> for LevelFilter { 1282d8ae3abSopenharmony_ci fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> 1292d8ae3abSopenharmony_ci where 1302d8ae3abSopenharmony_ci D: Deserializer<'de>, 1312d8ae3abSopenharmony_ci { 1322d8ae3abSopenharmony_ci struct LevelFilterIdentifier; 1332d8ae3abSopenharmony_ci 1342d8ae3abSopenharmony_ci impl<'de> Visitor<'de> for LevelFilterIdentifier { 1352d8ae3abSopenharmony_ci type Value = LevelFilter; 1362d8ae3abSopenharmony_ci 1372d8ae3abSopenharmony_ci fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 1382d8ae3abSopenharmony_ci formatter.write_str("log level filter") 1392d8ae3abSopenharmony_ci } 1402d8ae3abSopenharmony_ci 1412d8ae3abSopenharmony_ci fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> 1422d8ae3abSopenharmony_ci where 1432d8ae3abSopenharmony_ci E: Error, 1442d8ae3abSopenharmony_ci { 1452d8ae3abSopenharmony_ci // Case insensitive. 1462d8ae3abSopenharmony_ci FromStr::from_str(s).map_err(|_| Error::unknown_variant(s, &LOG_LEVEL_NAMES)) 1472d8ae3abSopenharmony_ci } 1482d8ae3abSopenharmony_ci 1492d8ae3abSopenharmony_ci fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E> 1502d8ae3abSopenharmony_ci where 1512d8ae3abSopenharmony_ci E: Error, 1522d8ae3abSopenharmony_ci { 1532d8ae3abSopenharmony_ci let variant = str::from_utf8(value) 1542d8ae3abSopenharmony_ci .map_err(|_| Error::invalid_value(Unexpected::Bytes(value), &self))?; 1552d8ae3abSopenharmony_ci 1562d8ae3abSopenharmony_ci self.visit_str(variant) 1572d8ae3abSopenharmony_ci } 1582d8ae3abSopenharmony_ci 1592d8ae3abSopenharmony_ci fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E> 1602d8ae3abSopenharmony_ci where 1612d8ae3abSopenharmony_ci E: Error, 1622d8ae3abSopenharmony_ci { 1632d8ae3abSopenharmony_ci let variant = LOG_LEVEL_NAMES 1642d8ae3abSopenharmony_ci .get(v as usize) 1652d8ae3abSopenharmony_ci .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?; 1662d8ae3abSopenharmony_ci 1672d8ae3abSopenharmony_ci self.visit_str(variant) 1682d8ae3abSopenharmony_ci } 1692d8ae3abSopenharmony_ci } 1702d8ae3abSopenharmony_ci 1712d8ae3abSopenharmony_ci impl<'de> DeserializeSeed<'de> for LevelFilterIdentifier { 1722d8ae3abSopenharmony_ci type Value = LevelFilter; 1732d8ae3abSopenharmony_ci 1742d8ae3abSopenharmony_ci fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 1752d8ae3abSopenharmony_ci where 1762d8ae3abSopenharmony_ci D: Deserializer<'de>, 1772d8ae3abSopenharmony_ci { 1782d8ae3abSopenharmony_ci deserializer.deserialize_identifier(LevelFilterIdentifier) 1792d8ae3abSopenharmony_ci } 1802d8ae3abSopenharmony_ci } 1812d8ae3abSopenharmony_ci 1822d8ae3abSopenharmony_ci struct LevelFilterEnum; 1832d8ae3abSopenharmony_ci 1842d8ae3abSopenharmony_ci impl<'de> Visitor<'de> for LevelFilterEnum { 1852d8ae3abSopenharmony_ci type Value = LevelFilter; 1862d8ae3abSopenharmony_ci 1872d8ae3abSopenharmony_ci fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 1882d8ae3abSopenharmony_ci formatter.write_str("log level filter") 1892d8ae3abSopenharmony_ci } 1902d8ae3abSopenharmony_ci 1912d8ae3abSopenharmony_ci fn visit_enum<A>(self, value: A) -> Result<Self::Value, A::Error> 1922d8ae3abSopenharmony_ci where 1932d8ae3abSopenharmony_ci A: EnumAccess<'de>, 1942d8ae3abSopenharmony_ci { 1952d8ae3abSopenharmony_ci let (level_filter, variant) = value.variant_seed(LevelFilterIdentifier)?; 1962d8ae3abSopenharmony_ci // Every variant is a unit variant. 1972d8ae3abSopenharmony_ci variant.unit_variant()?; 1982d8ae3abSopenharmony_ci Ok(level_filter) 1992d8ae3abSopenharmony_ci } 2002d8ae3abSopenharmony_ci } 2012d8ae3abSopenharmony_ci 2022d8ae3abSopenharmony_ci deserializer.deserialize_enum("LevelFilter", &LOG_LEVEL_NAMES, LevelFilterEnum) 2032d8ae3abSopenharmony_ci } 2042d8ae3abSopenharmony_ci} 2052d8ae3abSopenharmony_ci 2062d8ae3abSopenharmony_ci#[cfg(test)] 2072d8ae3abSopenharmony_cimod tests { 2082d8ae3abSopenharmony_ci extern crate serde_test; 2092d8ae3abSopenharmony_ci use self::serde_test::{assert_de_tokens, assert_de_tokens_error, assert_tokens, Token}; 2102d8ae3abSopenharmony_ci 2112d8ae3abSopenharmony_ci use {Level, LevelFilter}; 2122d8ae3abSopenharmony_ci 2132d8ae3abSopenharmony_ci fn level_token(variant: &'static str) -> Token { 2142d8ae3abSopenharmony_ci Token::UnitVariant { 2152d8ae3abSopenharmony_ci name: "Level", 2162d8ae3abSopenharmony_ci variant: variant, 2172d8ae3abSopenharmony_ci } 2182d8ae3abSopenharmony_ci } 2192d8ae3abSopenharmony_ci 2202d8ae3abSopenharmony_ci fn level_bytes_tokens(variant: &'static [u8]) -> [Token; 3] { 2212d8ae3abSopenharmony_ci [ 2222d8ae3abSopenharmony_ci Token::Enum { name: "Level" }, 2232d8ae3abSopenharmony_ci Token::Bytes(variant), 2242d8ae3abSopenharmony_ci Token::Unit, 2252d8ae3abSopenharmony_ci ] 2262d8ae3abSopenharmony_ci } 2272d8ae3abSopenharmony_ci 2282d8ae3abSopenharmony_ci fn level_variant_tokens(variant: u32) -> [Token; 3] { 2292d8ae3abSopenharmony_ci [ 2302d8ae3abSopenharmony_ci Token::Enum { name: "Level" }, 2312d8ae3abSopenharmony_ci Token::U32(variant), 2322d8ae3abSopenharmony_ci Token::Unit, 2332d8ae3abSopenharmony_ci ] 2342d8ae3abSopenharmony_ci } 2352d8ae3abSopenharmony_ci 2362d8ae3abSopenharmony_ci fn level_filter_token(variant: &'static str) -> Token { 2372d8ae3abSopenharmony_ci Token::UnitVariant { 2382d8ae3abSopenharmony_ci name: "LevelFilter", 2392d8ae3abSopenharmony_ci variant: variant, 2402d8ae3abSopenharmony_ci } 2412d8ae3abSopenharmony_ci } 2422d8ae3abSopenharmony_ci 2432d8ae3abSopenharmony_ci fn level_filter_bytes_tokens(variant: &'static [u8]) -> [Token; 3] { 2442d8ae3abSopenharmony_ci [ 2452d8ae3abSopenharmony_ci Token::Enum { 2462d8ae3abSopenharmony_ci name: "LevelFilter", 2472d8ae3abSopenharmony_ci }, 2482d8ae3abSopenharmony_ci Token::Bytes(variant), 2492d8ae3abSopenharmony_ci Token::Unit, 2502d8ae3abSopenharmony_ci ] 2512d8ae3abSopenharmony_ci } 2522d8ae3abSopenharmony_ci 2532d8ae3abSopenharmony_ci fn level_filter_variant_tokens(variant: u32) -> [Token; 3] { 2542d8ae3abSopenharmony_ci [ 2552d8ae3abSopenharmony_ci Token::Enum { 2562d8ae3abSopenharmony_ci name: "LevelFilter", 2572d8ae3abSopenharmony_ci }, 2582d8ae3abSopenharmony_ci Token::U32(variant), 2592d8ae3abSopenharmony_ci Token::Unit, 2602d8ae3abSopenharmony_ci ] 2612d8ae3abSopenharmony_ci } 2622d8ae3abSopenharmony_ci 2632d8ae3abSopenharmony_ci #[test] 2642d8ae3abSopenharmony_ci fn test_level_ser_de() { 2652d8ae3abSopenharmony_ci let cases = [ 2662d8ae3abSopenharmony_ci (Level::Error, [level_token("ERROR")]), 2672d8ae3abSopenharmony_ci (Level::Warn, [level_token("WARN")]), 2682d8ae3abSopenharmony_ci (Level::Info, [level_token("INFO")]), 2692d8ae3abSopenharmony_ci (Level::Debug, [level_token("DEBUG")]), 2702d8ae3abSopenharmony_ci (Level::Trace, [level_token("TRACE")]), 2712d8ae3abSopenharmony_ci ]; 2722d8ae3abSopenharmony_ci 2732d8ae3abSopenharmony_ci for &(s, expected) in &cases { 2742d8ae3abSopenharmony_ci assert_tokens(&s, &expected); 2752d8ae3abSopenharmony_ci } 2762d8ae3abSopenharmony_ci } 2772d8ae3abSopenharmony_ci 2782d8ae3abSopenharmony_ci #[test] 2792d8ae3abSopenharmony_ci fn test_level_case_insensitive() { 2802d8ae3abSopenharmony_ci let cases = [ 2812d8ae3abSopenharmony_ci (Level::Error, [level_token("error")]), 2822d8ae3abSopenharmony_ci (Level::Warn, [level_token("warn")]), 2832d8ae3abSopenharmony_ci (Level::Info, [level_token("info")]), 2842d8ae3abSopenharmony_ci (Level::Debug, [level_token("debug")]), 2852d8ae3abSopenharmony_ci (Level::Trace, [level_token("trace")]), 2862d8ae3abSopenharmony_ci ]; 2872d8ae3abSopenharmony_ci 2882d8ae3abSopenharmony_ci for &(s, expected) in &cases { 2892d8ae3abSopenharmony_ci assert_de_tokens(&s, &expected); 2902d8ae3abSopenharmony_ci } 2912d8ae3abSopenharmony_ci } 2922d8ae3abSopenharmony_ci 2932d8ae3abSopenharmony_ci #[test] 2942d8ae3abSopenharmony_ci fn test_level_de_bytes() { 2952d8ae3abSopenharmony_ci let cases = [ 2962d8ae3abSopenharmony_ci (Level::Error, level_bytes_tokens(b"ERROR")), 2972d8ae3abSopenharmony_ci (Level::Warn, level_bytes_tokens(b"WARN")), 2982d8ae3abSopenharmony_ci (Level::Info, level_bytes_tokens(b"INFO")), 2992d8ae3abSopenharmony_ci (Level::Debug, level_bytes_tokens(b"DEBUG")), 3002d8ae3abSopenharmony_ci (Level::Trace, level_bytes_tokens(b"TRACE")), 3012d8ae3abSopenharmony_ci ]; 3022d8ae3abSopenharmony_ci 3032d8ae3abSopenharmony_ci for &(value, tokens) in &cases { 3042d8ae3abSopenharmony_ci assert_de_tokens(&value, &tokens); 3052d8ae3abSopenharmony_ci } 3062d8ae3abSopenharmony_ci } 3072d8ae3abSopenharmony_ci 3082d8ae3abSopenharmony_ci #[test] 3092d8ae3abSopenharmony_ci fn test_level_de_variant_index() { 3102d8ae3abSopenharmony_ci let cases = [ 3112d8ae3abSopenharmony_ci (Level::Error, level_variant_tokens(0)), 3122d8ae3abSopenharmony_ci (Level::Warn, level_variant_tokens(1)), 3132d8ae3abSopenharmony_ci (Level::Info, level_variant_tokens(2)), 3142d8ae3abSopenharmony_ci (Level::Debug, level_variant_tokens(3)), 3152d8ae3abSopenharmony_ci (Level::Trace, level_variant_tokens(4)), 3162d8ae3abSopenharmony_ci ]; 3172d8ae3abSopenharmony_ci 3182d8ae3abSopenharmony_ci for &(value, tokens) in &cases { 3192d8ae3abSopenharmony_ci assert_de_tokens(&value, &tokens); 3202d8ae3abSopenharmony_ci } 3212d8ae3abSopenharmony_ci } 3222d8ae3abSopenharmony_ci 3232d8ae3abSopenharmony_ci #[test] 3242d8ae3abSopenharmony_ci fn test_level_de_error() { 3252d8ae3abSopenharmony_ci let msg = "unknown variant `errorx`, expected one of \ 3262d8ae3abSopenharmony_ci `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`"; 3272d8ae3abSopenharmony_ci assert_de_tokens_error::<Level>(&[level_token("errorx")], msg); 3282d8ae3abSopenharmony_ci } 3292d8ae3abSopenharmony_ci 3302d8ae3abSopenharmony_ci #[test] 3312d8ae3abSopenharmony_ci fn test_level_filter_ser_de() { 3322d8ae3abSopenharmony_ci let cases = [ 3332d8ae3abSopenharmony_ci (LevelFilter::Off, [level_filter_token("OFF")]), 3342d8ae3abSopenharmony_ci (LevelFilter::Error, [level_filter_token("ERROR")]), 3352d8ae3abSopenharmony_ci (LevelFilter::Warn, [level_filter_token("WARN")]), 3362d8ae3abSopenharmony_ci (LevelFilter::Info, [level_filter_token("INFO")]), 3372d8ae3abSopenharmony_ci (LevelFilter::Debug, [level_filter_token("DEBUG")]), 3382d8ae3abSopenharmony_ci (LevelFilter::Trace, [level_filter_token("TRACE")]), 3392d8ae3abSopenharmony_ci ]; 3402d8ae3abSopenharmony_ci 3412d8ae3abSopenharmony_ci for &(s, expected) in &cases { 3422d8ae3abSopenharmony_ci assert_tokens(&s, &expected); 3432d8ae3abSopenharmony_ci } 3442d8ae3abSopenharmony_ci } 3452d8ae3abSopenharmony_ci 3462d8ae3abSopenharmony_ci #[test] 3472d8ae3abSopenharmony_ci fn test_level_filter_case_insensitive() { 3482d8ae3abSopenharmony_ci let cases = [ 3492d8ae3abSopenharmony_ci (LevelFilter::Off, [level_filter_token("off")]), 3502d8ae3abSopenharmony_ci (LevelFilter::Error, [level_filter_token("error")]), 3512d8ae3abSopenharmony_ci (LevelFilter::Warn, [level_filter_token("warn")]), 3522d8ae3abSopenharmony_ci (LevelFilter::Info, [level_filter_token("info")]), 3532d8ae3abSopenharmony_ci (LevelFilter::Debug, [level_filter_token("debug")]), 3542d8ae3abSopenharmony_ci (LevelFilter::Trace, [level_filter_token("trace")]), 3552d8ae3abSopenharmony_ci ]; 3562d8ae3abSopenharmony_ci 3572d8ae3abSopenharmony_ci for &(s, expected) in &cases { 3582d8ae3abSopenharmony_ci assert_de_tokens(&s, &expected); 3592d8ae3abSopenharmony_ci } 3602d8ae3abSopenharmony_ci } 3612d8ae3abSopenharmony_ci 3622d8ae3abSopenharmony_ci #[test] 3632d8ae3abSopenharmony_ci fn test_level_filter_de_bytes() { 3642d8ae3abSopenharmony_ci let cases = [ 3652d8ae3abSopenharmony_ci (LevelFilter::Off, level_filter_bytes_tokens(b"OFF")), 3662d8ae3abSopenharmony_ci (LevelFilter::Error, level_filter_bytes_tokens(b"ERROR")), 3672d8ae3abSopenharmony_ci (LevelFilter::Warn, level_filter_bytes_tokens(b"WARN")), 3682d8ae3abSopenharmony_ci (LevelFilter::Info, level_filter_bytes_tokens(b"INFO")), 3692d8ae3abSopenharmony_ci (LevelFilter::Debug, level_filter_bytes_tokens(b"DEBUG")), 3702d8ae3abSopenharmony_ci (LevelFilter::Trace, level_filter_bytes_tokens(b"TRACE")), 3712d8ae3abSopenharmony_ci ]; 3722d8ae3abSopenharmony_ci 3732d8ae3abSopenharmony_ci for &(value, tokens) in &cases { 3742d8ae3abSopenharmony_ci assert_de_tokens(&value, &tokens); 3752d8ae3abSopenharmony_ci } 3762d8ae3abSopenharmony_ci } 3772d8ae3abSopenharmony_ci 3782d8ae3abSopenharmony_ci #[test] 3792d8ae3abSopenharmony_ci fn test_level_filter_de_variant_index() { 3802d8ae3abSopenharmony_ci let cases = [ 3812d8ae3abSopenharmony_ci (LevelFilter::Off, level_filter_variant_tokens(0)), 3822d8ae3abSopenharmony_ci (LevelFilter::Error, level_filter_variant_tokens(1)), 3832d8ae3abSopenharmony_ci (LevelFilter::Warn, level_filter_variant_tokens(2)), 3842d8ae3abSopenharmony_ci (LevelFilter::Info, level_filter_variant_tokens(3)), 3852d8ae3abSopenharmony_ci (LevelFilter::Debug, level_filter_variant_tokens(4)), 3862d8ae3abSopenharmony_ci (LevelFilter::Trace, level_filter_variant_tokens(5)), 3872d8ae3abSopenharmony_ci ]; 3882d8ae3abSopenharmony_ci 3892d8ae3abSopenharmony_ci for &(value, tokens) in &cases { 3902d8ae3abSopenharmony_ci assert_de_tokens(&value, &tokens); 3912d8ae3abSopenharmony_ci } 3922d8ae3abSopenharmony_ci } 3932d8ae3abSopenharmony_ci 3942d8ae3abSopenharmony_ci #[test] 3952d8ae3abSopenharmony_ci fn test_level_filter_de_error() { 3962d8ae3abSopenharmony_ci let msg = "unknown variant `errorx`, expected one of \ 3972d8ae3abSopenharmony_ci `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`"; 3982d8ae3abSopenharmony_ci assert_de_tokens_error::<LevelFilter>(&[level_filter_token("errorx")], msg); 3992d8ae3abSopenharmony_ci } 4002d8ae3abSopenharmony_ci} 401