summaryrefslogtreecommitdiffstats
path: root/src/json.rs
blob: 83d5cf55229c3c7da2a95c1bbc1ed9d2164b0846 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
use serde::{de, Deserialize, Deserializer};
use serde_json::Value;

/// Match a valid number from a string value to a `f64` value
pub fn number_from_string<'de, D: Deserializer<'de>>(deserializer: D) -> Result<f64, D::Error> {
    Ok(match Value::deserialize(deserializer)? {
        Value::String(s) => s.parse().map_err(de::Error::custom)?,
        Value::Number(num) => num
            .as_f64()
            .ok_or_else(|| de::Error::custom("Invalid number"))?,
        _ => return Err(de::Error::custom("wrong type")),
    })
}