use serde::{Deserializer, de::Visitor};
pub(crate) fn bool_or_uint<'de, D>(deserializer: D) -> Result<bool, D::Error>
where
D: Deserializer<'de>,
{
struct BoolOrUIntVisitor;
impl Visitor<'_> for BoolOrUIntVisitor {
type Value = bool;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("a boolean, or integer that's 0 or 1")
}
fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(v)
}
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match v {
0 => Ok(false),
1 => Ok(true),
_ => Err(serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self)),
}
}
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match v {
0 => Ok(false),
1 => Ok(true),
_ => {
Err(serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self))
}
}
}
}
deserializer.deserialize_any(BoolOrUIntVisitor)
}