open_library/
format.rs

1// TODO split up this file
2use serde::{Deserialize, Serialize};
3
4pub mod datetime {
5    use chrono::{DateTime, TimeZone, Utc};
6    use serde::{Deserialize, Deserializer, Serializer};
7
8    const FORMAT: &str = "%Y/%m/%d,%H:%M:%S";
9
10    pub fn serialize<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
11    where
12        S: Serializer,
13    {
14        let s = format!("{}", date.format(FORMAT));
15        serializer.serialize_str(&s)
16    }
17
18    pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
19    where
20        D: Deserializer<'de>,
21    {
22        Utc.datetime_from_str(&String::deserialize(deserializer)?, FORMAT)
23            .map_err(serde::de::Error::custom)
24    }
25}
26
27pub mod date {
28    use chrono::NaiveDate;
29    use serde::{Deserialize, Deserializer, Serializer};
30
31    const FORMAT: &str = "%d %B %Y";
32
33    pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
34    where
35        S: Serializer,
36    {
37        let s = format!("{}", date.format(FORMAT));
38        serializer.serialize_str(&s)
39    }
40
41    pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
42    where
43        D: Deserializer<'de>,
44    {
45        NaiveDate::parse_from_str(&String::deserialize(deserializer)?, FORMAT)
46            .map_err(serde::de::Error::custom)
47    }
48}
49
50pub mod date_m_dd_yyyy {
51    use chrono::NaiveDate;
52    use serde::{Deserialize, Deserializer, Serializer};
53
54    const FORMAT: &str = "%B %d, %Y";
55
56    pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
57    where
58        S: Serializer,
59    {
60        let s = format!("{}", date.format(FORMAT));
61        serializer.serialize_str(&s)
62    }
63
64    pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
65    where
66        D: Deserializer<'de>,
67    {
68        NaiveDate::parse_from_str(&String::deserialize(deserializer)?, FORMAT)
69            .map_err(serde::de::Error::custom)
70    }
71}
72
73#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
74pub struct KeyedValue<T> {
75    pub key: T,
76}
77
78pub mod keyed_value {
79    use crate::format::KeyedValue;
80    use serde::{Deserialize, Deserializer, Serialize, Serializer};
81
82    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
83    where
84        S: Serializer,
85        T: Serialize,
86    {
87        KeyedValue { key: value }.serialize(serializer)
88    }
89
90    pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
91    where
92        D: Deserializer<'de>,
93        T: Deserialize<'de>,
94    {
95        Ok(KeyedValue::deserialize(deserializer)?.key)
96    }
97}
98
99pub mod keyed_list {
100    use crate::format::KeyedValue;
101    use serde::{Deserialize, Deserializer, Serialize, Serializer};
102
103    pub fn serialize<S, T>(values: &[T], serializer: S) -> Result<S::Ok, S::Error>
104    where
105        S: Serializer,
106        T: Serialize,
107    {
108        values
109            .iter()
110            .map(|x| KeyedValue { key: x })
111            .collect::<Vec<KeyedValue<&T>>>()
112            .serialize(serializer)
113    }
114
115    pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
116    where
117        D: Deserializer<'de>,
118        T: Deserialize<'de>,
119    {
120        let result: Vec<KeyedValue<T>> = Deserialize::deserialize(deserializer)?;
121        let x1: Vec<T> = result.into_iter().map(|x: KeyedValue<T>| x.key).collect();
122        Ok(x1)
123    }
124}
125
126//TODO: convert into Tagged OpenLibraryTyped Enum
127pub mod value {
128    use serde::{Deserialize, Deserializer, Serialize, Serializer};
129
130    #[derive(Deserialize, Serialize)]
131    struct TypedValue<T> {
132        value: T,
133    }
134
135    pub fn serialize<S, T>(value: T, serializer: S) -> Result<S::Ok, S::Error>
136    where
137        S: Serializer,
138        T: Serialize,
139    {
140        TypedValue { value }.serialize(serializer)
141    }
142
143    pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
144    where
145        D: Deserializer<'de>,
146        T: Deserialize<'de>,
147    {
148        Ok(Some(TypedValue::deserialize(deserializer)?.value))
149    }
150}