space_track/space_track/
utils.rs1use 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}