tg_flows/types/
unit_true.rs

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