sol_chainsaw/
de.rs

1use std::str::FromStr;
2
3use serde::{de::Error, Deserialize, Deserializer};
4use solana_program::pubkey::Pubkey;
5
6/// Function to provide to [serde] in order to deserialize a [Pubkey] from a base58 string.
7/// Use as follows: `#[serde(deserialize_with = "pubkey_from_base58")]`
8pub fn pubkey_from_base58<'de, D>(deserializer: D) -> Result<Pubkey, D::Error>
9where
10    D: Deserializer<'de>,
11{
12    let s: &str = Deserialize::deserialize(deserializer)?;
13    Pubkey::from_str(s).map_err(D::Error::custom)
14}
15
16/// Function to provide to [serde] in order to deserialize a [Vec<Pubkey>] from a a vec of base58
17/// strings.
18/// Use as follows: `#[serde(deserialize_with = "vec_pubkey_from_base58")]`
19pub fn vec_pubkey_from_base58<'de, D>(
20    deserializer: D,
21) -> Result<Vec<Pubkey>, D::Error>
22where
23    D: Deserializer<'de>,
24{
25    let xs: Vec<&str> = Deserialize::deserialize(deserializer)?;
26    xs.into_iter()
27        .map(|s| Pubkey::from_str(s).map_err(D::Error::custom))
28        .collect()
29}
30
31/// Function to provide to [serde] in order to deserialize a [Option<Pubkey>] from a base58 string
32/// option.
33/// Use as follows: `#[serde(deserialize_with = "opt_pubkey_from_base58")]`
34pub fn opt_pubkey_from_base58<'de, D>(
35    deserializer: D,
36) -> Result<Option<Pubkey>, D::Error>
37where
38    D: Deserializer<'de>,
39{
40    let opt: Option<&str> = Deserialize::deserialize(deserializer)?;
41    opt.map(|s| Pubkey::from_str(s).map_err(D::Error::custom))
42        .transpose()
43}
44
45/// Function to provide to [serde] in order to deserialize a [u64] from a string.
46/// Use as follows: `#[serde(deserialize_with = "u64_from_string")]`
47pub fn u64_from_string<'de, D>(deserializer: D) -> Result<u64, D::Error>
48where
49    D: Deserializer<'de>,
50{
51    let s: &str = Deserialize::deserialize(deserializer)?;
52    u64::from_str(s).map_err(D::Error::custom)
53}
54
55/// Function to provide to [serde] in order to deserialize a [i64] from a string.
56/// Use as follows: `#[serde(deserialize_with = "i64_from_string")]`
57pub fn i64_from_string<'de, D>(deserializer: D) -> Result<i64, D::Error>
58where
59    D: Deserializer<'de>,
60{
61    let s: &str = Deserialize::deserialize(deserializer)?;
62    i64::from_str(s).map_err(D::Error::custom)
63}
64
65/// Function to provide to [serde] in order to deserialize a [u128] from a string.
66/// Use as follows: `#[serde(deserialize_with = "u128_from_string")]`
67pub fn u128_from_string<'de, D>(deserializer: D) -> Result<u128, D::Error>
68where
69    D: Deserializer<'de>,
70{
71    let s: &str = Deserialize::deserialize(deserializer)?;
72    u128::from_str(s).map_err(D::Error::custom)
73}
74
75/// Function to provide to [serde] in order to deserialize a [i128] from a string.
76/// Use as follows: `#[serde(deserialize_with = "i128_from_string")]`
77pub fn i128_from_string<'de, D>(deserializer: D) -> Result<i128, D::Error>
78where
79    D: Deserializer<'de>,
80{
81    let s: &str = Deserialize::deserialize(deserializer)?;
82    i128::from_str(s).map_err(D::Error::custom)
83}