space_track/space_track/
utils.rs

1use std::str::FromStr;
2
3use serde::{de, Deserialize, Deserializer};
4use serde_json::Value;
5
6use crate::Direction;
7
8fn deserialize_string<'de, D: Deserializer<'de>, T: FromStr>(deserializer: D) -> Result<T, D::Error>
9where
10    <T as FromStr>::Err: std::fmt::Display,
11{
12    Ok(match Value::deserialize(deserializer)? {
13        Value::String(s) => s.parse().map_err(de::Error::custom)?,
14        _ => return Err(de::Error::custom("wrong type")),
15    })
16}
17
18fn deserialize_optional_string<'de, D: Deserializer<'de>, T: FromStr>(
19    deserializer: D,
20) -> Result<Option<T>, D::Error>
21where
22    <T as FromStr>::Err: std::fmt::Display,
23{
24    Ok(match Value::deserialize(deserializer)? {
25        Value::String(s) => Some(s.parse().map_err(de::Error::custom)?),
26        Value::Null => None,
27        _ => return Err(de::Error::custom("wrong type")),
28    })
29}
30
31pub fn deserialize_optional_string_to_u64<'de, D: Deserializer<'de>>(
32    deserializer: D,
33) -> Result<Option<u64>, D::Error> {
34    deserialize_optional_string(deserializer)
35}
36
37pub fn deserialize_string_to_u64<'de, D: Deserializer<'de>>(
38    deserializer: D,
39) -> Result<u64, D::Error> {
40    deserialize_string(deserializer)
41}
42
43pub fn deserialize_string_to_f64<'de, D: Deserializer<'de>>(
44    deserializer: D,
45) -> Result<f64, D::Error> {
46    deserialize_string(deserializer)
47}
48
49pub fn deserialize_string_to_u8<'de, D: Deserializer<'de>>(
50    deserializer: D,
51) -> Result<u8, D::Error> {
52    deserialize_string(deserializer)
53}
54
55pub fn deserialize_optional_string_to_u8<'de, D: Deserializer<'de>>(
56    deserializer: D,
57) -> Result<Option<u8>, D::Error> {
58    deserialize_optional_string(deserializer)
59}
60
61pub fn deserialize_optional_string_to_f64<'de, D: Deserializer<'de>>(
62    deserializer: D,
63) -> Result<Option<f64>, D::Error> {
64    deserialize_optional_string(deserializer)
65}
66
67pub fn deserialize_string_to_bool<'de, D: Deserializer<'de>>(
68    deserializer: D,
69) -> Result<bool, D::Error> {
70    Ok(match Value::deserialize(deserializer)? {
71        Value::String(s) => s == "Y",
72        _ => return Err(de::Error::custom("wrong type")),
73    })
74}
75
76pub fn deserialize_string_to_direction<'de, D: Deserializer<'de>>(
77    deserializer: D,
78) -> Result<Direction, D::Error> {
79    Ok(match Value::deserialize(deserializer)? {
80        Value::String(s) => match s.as_str() {
81            "ascending" => Direction::Ascending,
82            "descending" => Direction::Descending,
83            _ => return Err(de::Error::custom("wrong value")),
84        },
85        _ => return Err(de::Error::custom("wrong type")),
86    })
87}