gmsol_sdk/serde/
string_pubkey.rs

1use std::{borrow::Borrow, fmt, ops::Deref, str::FromStr};
2
3use solana_sdk::pubkey::Pubkey;
4
5/// A wrapper for [`Pubkey`], allowing it to be serialized to and deserialized from base58 string.
6#[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/// Serialize [`Pubkey`] as string.
51#[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    /// Serialize as string.
59    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    /// Deserialize from str.
67    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}