use std::str::FromStr;
use serde::{de::Error, Deserialize, Deserializer};
use solana_program::pubkey::Pubkey;
pub fn pubkey_from_base58<'de, D>(deserializer: D) -> Result<Pubkey, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
Pubkey::from_str(s).map_err(D::Error::custom)
}
pub fn vec_pubkey_from_base58<'de, D>(
deserializer: D,
) -> Result<Vec<Pubkey>, D::Error>
where
D: Deserializer<'de>,
{
let xs: Vec<&str> = Deserialize::deserialize(deserializer)?;
xs.into_iter()
.map(|s| Pubkey::from_str(s).map_err(D::Error::custom))
.collect()
}
pub fn opt_pubkey_from_base58<'de, D>(
deserializer: D,
) -> Result<Option<Pubkey>, D::Error>
where
D: Deserializer<'de>,
{
let opt: Option<&str> = Deserialize::deserialize(deserializer)?;
opt.map(|s| Pubkey::from_str(s).map_err(D::Error::custom))
.transpose()
}
pub fn u64_from_string<'de, D>(deserializer: D) -> Result<u64, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
u64::from_str(s).map_err(D::Error::custom)
}
pub fn i64_from_string<'de, D>(deserializer: D) -> Result<i64, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
i64::from_str(s).map_err(D::Error::custom)
}
pub fn u128_from_string<'de, D>(deserializer: D) -> Result<u128, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
u128::from_str(s).map_err(D::Error::custom)
}
pub fn i128_from_string<'de, D>(deserializer: D) -> Result<i128, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
i128::from_str(s).map_err(D::Error::custom)
}