tg_flows/types/
unit_true.rs1use serde::{
2 de::{self, Deserialize, Deserializer, Visitor},
3 ser::{Serialize, Serializer},
4};
5
6#[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}