codama_nodes/shared/
is_account_signer.rs1use 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}