use num_bigint::BigInt;
use serde::de::Unexpected;
use serde::{de, Deserializer};
use std::fmt;
use std::str::FromStr;
struct DeserializeToBigIntVisitor;
impl<'de> de::Visitor<'de> for DeserializeToBigIntVisitor {
type Value = BigInt;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("an integer or a string")
}
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(BigInt::from(v))
}
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(BigInt::from(v))
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
BigInt::from_str(v).map_err(|e| E::invalid_value(Unexpected::Str(&e.to_string()), &self))
}
}
pub(crate) fn deserialize_id<'de, D>(deserializer: D) -> Result<BigInt, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_any(DeserializeToBigIntVisitor)
}
pub(crate) fn deserialize_string_to_bigint<'de, D>(deserializer: D) -> Result<BigInt, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_str(DeserializeToBigIntVisitor)
}
pub(crate) fn deserialize_u64_to_bigint<'de, D>(deserializer: D) -> Result<BigInt, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_u64(DeserializeToBigIntVisitor)
}