tg_flows/types/
unit_false.rs

1use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer};
2
3/// A type that is always false.
4#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, Default)]
5pub struct False;
6
7impl std::convert::TryFrom<bool> for False {
8    type Error = ();
9
10    fn try_from(value: bool) -> Result<Self, Self::Error> {
11        match value {
12            true => Err(()),
13            false => Ok(False),
14        }
15    }
16}
17
18impl<'de> Deserialize<'de> for False {
19    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        deserializer.deserialize_bool(FalseVisitor)
24    }
25}
26
27struct FalseVisitor;
28
29impl<'de> Visitor<'de> for FalseVisitor {
30    type Value = False;
31
32    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
33        write!(formatter, "bool, equal to `false`")
34    }
35
36    fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E>
37    where
38        E: serde::de::Error,
39    {
40        match value {
41            true => Err(E::custom("expected `false`, found `true`")),
42            false => Ok(False),
43        }
44    }
45}
46
47impl Serialize for False {
48    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
49    where
50        S: Serializer,
51    {
52        serializer.serialize_bool(false)
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use serde_json::{from_str, to_string};
59
60    use super::False;
61
62    #[test]
63    fn unit_false_de() {
64        let json = "false";
65        let expected = False;
66        let actual = from_str(json).unwrap();
67        assert_eq!(expected, actual);
68    }
69
70    #[test]
71    fn unit_false_se() {
72        let actual = to_string(&False).unwrap();
73        let expected = "false";
74        assert_eq!(expected, actual);
75    }
76}