openrtb_native1/
serde.rs

1use serde::{Deserialize, Deserializer, Serializer};
2
3pub mod i32_as_bool {
4    use super::*;
5
6    pub fn serialize<S>(v: &bool, serializer: S) -> Result<S::Ok, S::Error>
7    where
8        S: Serializer,
9    {
10        serializer.serialize_i32(if *v { 1 } else { 0 })
11    }
12
13    pub fn deserialize<'de, D>(deserializer: D) -> Result<bool, D::Error>
14    where
15        D: Deserializer<'de>,
16    {
17        match i32::deserialize(deserializer)? {
18            0 => Ok(false),
19            1 => Ok(true),
20            v => {
21                let s = format!("invalid value: {}, expected 0 or 1", v);
22                Err(serde::de::Error::custom(s))
23            }
24        }
25    }
26}
27
28#[cfg(test)]
29mod test {
30    #[test]
31    fn i32_as_bool() -> serde_json::Result<()> {
32        #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq)]
33        struct O {
34            #[serde(with = "crate::serde::i32_as_bool")]
35            flag: bool,
36        }
37
38        assert!(serde_json::from_str::<O>(r#"{}"#).is_err());
39        assert!(serde_json::from_str::<O>(r#"{"flag":-1}"#).is_err());
40        assert!(serde_json::from_str::<O>(r#"{"flag":2}"#).is_err());
41
42        let j1 = r#"{"flag":1}"#;
43        let o1 = serde_json::from_str::<O>(j1)?;
44        assert_eq!(o1, O { flag: true });
45        assert_eq!(serde_json::to_string(&o1)?, j1);
46
47        let j2 = r#"{"flag":0}"#;
48        let o2 = serde_json::from_str::<O>(j2)?;
49        assert_eq!(o2, O { flag: false });
50        assert_eq!(serde_json::to_string(&o2)?, j2);
51
52        Ok(())
53    }
54}