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