macro_rules! visitor_64 {
($name: ident, $t: ty, $msg: literal) => {
struct $name;
impl serde::de::Visitor<'_> for $name {
type Value = $t;
fn visit_str<E>(self, value: &str) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
if let Ok(v) = value.parse::<i128>() {
return self.visit_i128(v);
}
let number = value.parse::<f64>().map_err(E::custom)?;
self.visit_f64(number)
}
fn visit_i64<E>(self, value: i64) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
match value {
_ if value < <$t>::MIN as i64 => Err(self::value_error(value)),
_ => Ok(value as Self::Value),
}
}
fn visit_u64<E>(self, value: u64) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
match value {
_ if value > <$t>::MAX as u64 => Err(self::value_error(value)),
_ => Ok(value as Self::Value),
}
}
fn visit_f64<E>(self, value: f64) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
match value {
_ if value < <$t>::MIN as f64 => Err(self::value_error(value)),
_ if value > <$t>::MAX as f64 => Err(self::value_error(value)),
_ if value.fract() != 0.0 => Err(self::value_error(value)),
_ => Ok(value as Self::Value),
}
}
fn visit_i128<E>(self, value: i128) -> std::result::Result<Self::Value, E>
where
E: serde::de::Error,
{
match value {
_ if value < <$t>::MIN as i128 => Err(self::value_error(value)),
_ if value > <$t>::MAX as i128 => Err(self::value_error(value)),
_ => Ok(value as Self::Value),
}
}
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str($msg)
}
}
fn value_error<T, E>(value: T) -> E
where
T: std::fmt::Display,
E: serde::de::Error,
{
E::invalid_value(Other(&format!("{value}")), &$msg)
}
};
}