qust_ds/
save.rs

1use bincode;
2use serde::{ 
3    Serialize, 
4    Serializer, 
5    ser::SerializeSeq, 
6    de::{self, Error, SeqAccess, DeserializeOwned, DeserializeSeed}, 
7    Deserializer
8};
9use std::{io::{BufReader, BufWriter, Write}, path::PathBuf, sync::RwLock};
10use serde_json;
11use crate::prelude::*;
12use chrono::Datelike;
13
14struct VecEle;
15
16impl<'de> de::Visitor<'de> for VecEle {
17    type Value  = dt;
18    
19    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
20        formatter.write_str("a string")
21    }
22
23    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
24    where
25        E: Error,
26    {
27        let res = chrono::DateTime::from_timestamp_millis(v).unwrap();
28        let res = res.naive_local();
29        Ok(res)
30    }
31}
32
33impl<'de> DeserializeSeed<'de> for VecEle {
34    type Value = dt;
35    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
36    where
37        D: Deserializer<'de>
38    {
39        deserializer.deserialize_i64(self)
40    }
41}
42
43
44pub fn serialize_dt<S>(id: &dt, s: S) -> Result<S::Ok, S::Error>
45where
46    S: Serializer,
47{
48    let es = id.and_utc().timestamp_millis();
49    s.serialize_i64(es)
50}
51
52pub fn deserialize_dt<'de, D>(deserializer: D) -> Result<dt, D::Error>
53where
54    D: de::Deserializer<'de>,
55{
56    deserializer.deserialize_i64(VecEle)
57}
58
59pub fn serialize_vec_dt<S>(id: &vdt, s: S) -> Result<S::Ok, S::Error>
60where
61    S: Serializer,
62{
63    let mut seq = s.serialize_seq(Some(id.len()))?;
64    for e in id {
65        let es = e.and_utc().timestamp_millis();
66        seq.serialize_element(&es)?;
67    }
68    seq.end()
69}
70
71pub fn deserialize_vec_dt<'de, D>(deserializer: D) -> Result<vdt, D::Error>
72where
73    D: de::Deserializer<'de>,
74{
75    struct VecDt;
76
77    impl<'de> de::Visitor<'de> for VecDt {
78        type Value = Vec<dt>;
79    
80        fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
81            formatter.write_str("a string containing json data")
82        }
83
84        fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
85        where
86            A: SeqAccess<'de>,
87        {
88            let mut res: Self::Value = Vec::with_capacity(seq.size_hint().unwrap_or_default());
89            while let Some(ele) = seq.next_element_seed(VecEle)? {
90                res.push(ele);
91            }
92            Ok(res)
93        }
94    }
95    deserializer.deserialize_seq(VecDt)
96}
97
98pub fn serialize_vec_da<S>(dates: &[da], serializer: S) -> Result<S::Ok, S::Error>
99where
100    S: serde::Serializer,
101{
102    let days_since_epoch: Vec<i32> = dates.iter().map(|d| d.num_days_from_ce()).collect();
103    days_since_epoch.serialize(serializer)
104}
105
106pub fn deserialize_vec_da<'de, D>(deserializer: D) -> Result<Vec<da>, D::Error>
107where
108    D: serde::Deserializer<'de>,
109{
110    let days_since_epoch: Vec<i32> = Vec::deserialize(deserializer)?;
111    Ok(days_since_epoch
112        .into_iter()
113        .map(|x| da::from_num_days_from_ce_opt(x).unwrap())
114        .collect())
115}
116
117
118pub fn serialize_rwlock<T, S>(data: &RwLock<T>, s: S) -> Result<S::Ok, S::Error>
119where
120    T: Clone + Serialize,
121    S: Serializer,
122{
123    let data = data.read().unwrap().clone();
124    data.serialize(s)
125}
126
127pub fn deserialize_rwlock<'de, D, T>(desrializer: D) -> Result<RwLock<T>, D::Error>
128where
129    T: Deserialize<'de>,
130    D: Deserializer<'de>,
131{
132    let data = T::deserialize(desrializer)?;
133    Ok(RwLock::new(data))
134}
135
136
137pub trait Sof: Sized {
138    fn sof(&self, name: &str, path: &str)
139    where
140        Self: Serialize,
141    {
142        let full_path = path.to_owned() + "/" + name;
143        let w = std::fs::File::create(full_path).unwrap();
144        let mut f = BufWriter::new(w);
145        bincode::serialize_into(&mut f, self).unwrap();
146    }
147    fn rof(name: &str, path: &str) -> Self 
148    where
149        Self: DeserializeOwned,
150    {
151        let full_path = path.to_owned() + "/" + name;
152        let r = std::fs::File::open(&full_path)
153            .unwrap_or_else(|_| panic!("file not exist: {}", full_path));
154        let mut f = BufReader::new(r);
155        let res: Self = bincode::deserialize_from::<&mut BufReader<std::fs::File>, Self>(&mut f).unwrap();
156        res
157    }
158
159    fn sof_json(&self, name: &str, path: &str)
160    where
161        Self: Serialize,
162    {
163        let sof_string = serde_json::to_string(self).unwrap();
164        sof_string.sof(name, path);
165    }
166    fn rof_json(name: &str, path: &str) -> Self
167    where
168        Self: DeserializeOwned,
169    {
170        let rof_string = rof::<String>(name, path);
171        serde_json::from_str(&rof_string).unwrap()
172    }
173
174    fn sof_json_pretty(&self, name: &str, path: &str)
175    where
176        Self: Serialize,
177    {
178        let sof_string = serde_json::to_string_pretty(self).unwrap();
179        let full_path = path.to_owned() + "/" + name;
180        let w = std::fs::File::create(full_path).unwrap();
181        let mut f = BufWriter::new(w);
182        write!(f, "{}", sof_string).unwrap();
183    }
184
185    fn json_string(&self) -> String
186    where
187        Self: Serialize,
188    {
189        serde_json::to_string(self).unwrap()
190    }
191
192    fn json_string_pretty(&self) -> String
193    where
194        Self: Serialize,
195    {
196        serde_json::to_string_pretty(self).unwrap()
197    }
198
199    fn my_obj<T>(&self) -> T
200    where
201        Self: AsRef<str>,
202        T: DeserializeOwned,
203    {
204        serde_json::from_str(self.as_ref()).unwrap()
205    }
206
207    fn test_save(&self, n: usize) -> (f32, f32)
208    where
209        Self: Serialize + DeserializeOwned,
210    {
211        let timer = std::time::Instant::now();
212        for _ in 0..n {
213            self.sof("__sof__", ".");
214            let _data = rof::<Self>("__sof__", ".");
215        }
216        let time_pass = timer.elapsed().as_millis() as f32 / n as f32;
217        let p = PathBuf::from("__sof__");
218        let data_size = p.metadata().unwrap().len() as f32 / (1024. * 1024.);
219        p.remove();
220        (time_pass, data_size)
221    }
222
223    fn rof_vec(data: &[u8]) -> Self
224    where
225        Self: DeserializeOwned,
226    {
227        bincode::deserialize(data).unwrap()
228    }
229}
230
231impl<T> Sof for T {}
232pub fn rof<T: DeserializeOwned>(name: &str, path: &str) -> T {
233    <T as Sof>::rof(name, path)
234}
235pub fn rof_json<T: DeserializeOwned + Serialize>(name: &str, path: &str) -> T {
236    <T as Sof>::rof_json(name, path)
237}
238pub fn rof_serialized<T: DeserializeOwned>(data: &[u8]) -> T {
239    bincode::deserialize(data).unwrap()
240}