codama_nodes/shared/
is_account_signer.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
4pub enum IsAccountSigner {
5    #[default]
6    False,
7    True,
8    Either,
9}
10
11impl From<bool> for IsAccountSigner {
12    fn from(value: bool) -> Self {
13        match value {
14            false => Self::False,
15            true => Self::True,
16        }
17    }
18}
19
20impl Serialize for IsAccountSigner {
21    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22    where
23        S: serde::Serializer,
24    {
25        match self {
26            IsAccountSigner::False => serializer.serialize_bool(false),
27            IsAccountSigner::True => serializer.serialize_bool(true),
28            IsAccountSigner::Either => serializer.serialize_str("either"),
29        }
30    }
31}
32
33impl<'de> Deserialize<'de> for IsAccountSigner {
34    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
35    where
36        D: serde::Deserializer<'de>,
37    {
38        struct IsAccountSignerVisitor;
39
40        impl serde::de::Visitor<'_> for IsAccountSignerVisitor {
41            type Value = IsAccountSigner;
42
43            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
44                formatter.write_str("a boolean or the string 'either'")
45            }
46
47            fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E>
48            where
49                E: serde::de::Error,
50            {
51                Ok(IsAccountSigner::from(value))
52            }
53
54            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
55            where
56                E: serde::de::Error,
57            {
58                match value {
59                    "either" => Ok(IsAccountSigner::Either),
60                    _ => Err(E::custom(format!("unexpected value: {value}"))),
61                }
62            }
63        }
64
65        deserializer.deserialize_any(IsAccountSignerVisitor)
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72
73    #[test]
74    fn to_json() {
75        assert_eq!(
76            serde_json::to_string(&IsAccountSigner::True).unwrap(),
77            "true"
78        );
79        assert_eq!(
80            serde_json::to_string(&IsAccountSigner::False).unwrap(),
81            "false"
82        );
83        assert_eq!(
84            serde_json::to_string(&IsAccountSigner::Either).unwrap(),
85            "\"either\""
86        );
87    }
88
89    #[test]
90    fn from_json() {
91        assert_eq!(
92            serde_json::from_str::<IsAccountSigner>("true").unwrap(),
93            IsAccountSigner::True
94        );
95        assert_eq!(
96            serde_json::from_str::<IsAccountSigner>("false").unwrap(),
97            IsAccountSigner::False
98        );
99        assert_eq!(
100            serde_json::from_str::<IsAccountSigner>("\"either\"").unwrap(),
101            IsAccountSigner::Either
102        );
103    }
104}