use serde::de::{Deserialize, Deserializer, Visitor};
use serde::{self, Serialize};
use std::ops::Deref;
#[derive(Clone, Copy, Debug)]
pub struct F64(pub f64);
impl Deref for F64 {
type Target = f64;
fn deref(&self) -> &f64 {
&self.0
}
}
impl Serialize for F64 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&self.0.to_string())
}
}
impl<'de> Deserialize<'de> for F64 {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct MyVisitor;
impl Visitor<'_> for MyVisitor {
type Value = F64;
fn expecting(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
fmt.write_str("number or string")
}
fn visit_f64<E>(self, val: f64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(F64(val))
}
fn visit_str<E>(self, val: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match val.parse::<f64>() {
Ok(val) => self.visit_f64(val),
Err(_) => Err(E::custom("failed to parse integer")),
}
}
}
deserializer.deserialize_any(MyVisitor)
}
}