1use serde::de::{Error, Unexpected};
2use serde::Deserializer;
3use std::fmt;
4
5struct BoolVisitor;
6impl serde::de::Visitor<'_> for BoolVisitor {
7 type Value = bool;
8
9 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
10 write!(formatter, "bool value")
11 }
12
13 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
14 where
15 E: Error,
16 {
17 match v {
18 0 => Ok(false),
19 1 => Ok(true),
20 _ => Err(E::invalid_value(Unexpected::Signed(v), &"0 or 1")),
21 }
22 }
23
24 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
25 where
26 E: Error,
27 {
28 match v {
29 "0" | "no" => Ok(false),
30 "1" | "yes" => Ok(true),
31 other => Err(E::invalid_value(Unexpected::Str(other), &"bool")),
32 }
33 }
34}
35
36pub fn deserialize_bool<'de, D: Deserializer<'de>>(deserializer: D) -> Result<bool, D::Error> {
37 deserializer.deserialize_any(BoolVisitor)
38}