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}