gmsol_sdk/serde/
string_pubkey.rs1use std::{borrow::Borrow, fmt, ops::Deref, str::FromStr};
2
3use solana_sdk::pubkey::Pubkey;
4
5#[cfg_attr(serde, derive(serde::Serialize, serde::Deserialize))]
7#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct StringPubkey(#[cfg_attr(serde, serde(with = "pubkey"))] pub Pubkey);
9
10impl From<Pubkey> for StringPubkey {
11 fn from(value: Pubkey) -> Self {
12 Self(value)
13 }
14}
15
16impl From<StringPubkey> for Pubkey {
17 fn from(value: StringPubkey) -> Self {
18 value.0
19 }
20}
21
22impl Deref for StringPubkey {
23 type Target = Pubkey;
24
25 fn deref(&self) -> &Self::Target {
26 &self.0
27 }
28}
29
30impl FromStr for StringPubkey {
31 type Err = <Pubkey as FromStr>::Err;
32
33 fn from_str(s: &str) -> Result<Self, Self::Err> {
34 Ok(Self(Pubkey::from_str(s)?))
35 }
36}
37
38impl Borrow<Pubkey> for StringPubkey {
39 fn borrow(&self) -> &Pubkey {
40 &self.0
41 }
42}
43
44impl fmt::Display for StringPubkey {
45 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46 write!(f, "{}", self.0)
47 }
48}
49
50#[cfg(serde)]
52pub mod pubkey {
53 use std::borrow::Cow;
54
55 use serde::{Deserialize, Deserializer, Serializer};
56 use solana_sdk::pubkey::Pubkey;
57
58 pub fn serialize<S>(pubkey: &Pubkey, serializer: S) -> Result<S::Ok, S::Error>
60 where
61 S: Serializer,
62 {
63 serializer.serialize_str(&pubkey.to_string())
64 }
65
66 pub fn deserialize<'de, D>(deserializer: D) -> Result<Pubkey, D::Error>
68 where
69 D: Deserializer<'de>,
70 {
71 let pubkey: Cow<'de, str> = Deserialize::deserialize(deserializer)?;
72 pubkey
73 .parse::<Pubkey>()
74 .map_err(<D::Error as serde::de::Error>::custom)
75 }
76}
77
78#[cfg(test)]
79mod tests {
80
81 #[cfg(serde)]
82 #[test]
83 fn string_pubkey() {
84 use super::StringPubkey;
85
86 const PUBKEY_STR: &str = r#""1111111QLbz7JHiBTspS962RLKV8GndWFwiEaqKM""#;
87 let pubkey: StringPubkey = serde_json::from_str(PUBKEY_STR).unwrap();
88 assert_eq!(serde_json::to_string(&pubkey).unwrap(), PUBKEY_STR);
89 }
90}