storekey/
encode.rs

1use std::borrow::Cow;
2use std::collections::{BTreeMap, HashMap};
3use std::io::Write;
4use std::ops::Bound;
5use std::time::Duration;
6
7use super::{Encode, EncodeError, Writer};
8
9impl<F, E: Encode<F> + ?Sized> Encode<F> for &E {
10	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
11		E::encode(self, w)
12	}
13}
14
15impl<F, E: Encode<F>> Encode<F> for Option<E> {
16	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
17		match self.as_ref() {
18			None => w.write_u8(2),
19			Some(x) => {
20				w.write_u8(3)?;
21				E::encode(x, w)
22			}
23		}
24	}
25}
26
27impl<F, E: Encode<F>> Encode<F> for Bound<E> {
28	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
29		match self {
30			Bound::Excluded(v) => {
31				w.write_u8(4)?;
32				Encode::encode(v, w)
33			}
34			Bound::Included(v) => {
35				w.write_u8(3)?;
36				Encode::encode(v, w)
37			}
38			Bound::Unbounded => w.write_u8(2),
39		}
40	}
41}
42
43impl<F, O: Encode<F>, E: Encode<F>> Encode<F> for Result<O, E> {
44	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
45		match self.as_ref() {
46			Ok(x) => {
47				w.write_u8(2)?;
48				O::encode(x, w)
49			}
50			Err(e) => {
51				w.write_u8(3)?;
52				E::encode(e, w)
53			}
54		}
55	}
56}
57
58impl<F> Encode<F> for bool {
59	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
60		if *self {
61			w.write_u8(3)
62		} else {
63			w.write_u8(2)
64		}
65	}
66}
67
68impl<F> Encode<F> for char {
69	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
70		w.write_u32(*self as u32)
71	}
72}
73
74impl<F> Encode<F> for str {
75	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
76		w.write_slice(self.as_bytes())
77	}
78}
79
80impl<F> Encode<F> for String {
81	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
82		w.write_slice(self.as_bytes())
83	}
84}
85
86impl<F> Encode<F> for Duration {
87	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
88		w.write_u64(self.as_secs())?;
89		w.write_u32(self.subsec_nanos())
90	}
91}
92
93impl<F, E: Encode<F>> Encode<F> for [E] {
94	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
95		for e in self.iter() {
96			w.mark_terminator();
97			e.encode(w)?;
98		}
99		w.write_terminator()
100	}
101}
102
103impl<F, E: Encode<F>> Encode<F> for Vec<E> {
104	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
105		for e in self.iter() {
106			w.mark_terminator();
107			e.encode(w)?;
108		}
109		w.write_terminator()
110	}
111}
112
113impl<F, E: Encode<F>> Encode<F> for Box<E> {
114	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
115		self.as_ref().encode(w)
116	}
117}
118
119impl<F, E: Encode<F> + ToOwned + ?Sized> Encode<F> for Cow<'_, E> {
120	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
121		self.as_ref().encode(w)
122	}
123}
124
125impl<F, K: Encode<F>, V: Encode<F>, S> Encode<F> for HashMap<K, V, S> {
126	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
127		for (k, v) in self.iter() {
128			w.mark_terminator();
129			k.encode(w)?;
130			v.encode(w)?;
131		}
132		w.write_terminator()
133	}
134}
135
136impl<F, K: Encode<F>, V: Encode<F>> Encode<F> for BTreeMap<K, V> {
137	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
138		for (k, v) in self.iter() {
139			w.mark_terminator();
140			k.encode(w)?;
141			v.encode(w)?;
142		}
143		w.write_terminator()
144	}
145}
146
147impl<F, T: Encode<F>, const SIZE: usize> Encode<F> for [T; SIZE] {
148	fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
149		for i in self.iter() {
150			i.encode(w)?;
151		}
152		Ok(())
153	}
154}
155
156macro_rules! impl_encode_tuple{
157    ($($t:ident),*$(,)?) => {
158		impl <Format,$($t: Encode<Format>),*> Encode<Format> for ($($t,)*){
159			#[allow(non_snake_case)]
160			fn encode<W: Write>(&self, _w: &mut Writer<W>) -> Result<(),EncodeError> {
161				let ($($t,)*) = self;
162				$(
163					$t.encode(_w)?;
164				)*
165				Ok(())
166
167			}
168		}
169
170    };
171}
172
173impl_encode_tuple!();
174impl_encode_tuple!(A);
175impl_encode_tuple!(A, B);
176impl_encode_tuple!(A, B, C);
177impl_encode_tuple!(A, B, C, D);
178impl_encode_tuple!(A, B, C, D, E);
179impl_encode_tuple!(A, B, C, D, E, F);
180
181macro_rules! impl_encode_prim {
182	($ty:ident,$name:ident) => {
183		impl<F> Encode<F> for $ty {
184			fn encode<W: Write>(&self, w: &mut Writer<W>) -> Result<(), EncodeError> {
185				w.$name(*self)
186			}
187		}
188	};
189}
190
191impl_encode_prim!(u8, write_u8);
192impl_encode_prim!(i8, write_i8);
193impl_encode_prim!(u16, write_u16);
194impl_encode_prim!(i16, write_i16);
195impl_encode_prim!(u32, write_u32);
196impl_encode_prim!(i32, write_i32);
197impl_encode_prim!(u64, write_u64);
198impl_encode_prim!(i64, write_i64);
199impl_encode_prim!(u128, write_u128);
200impl_encode_prim!(i128, write_i128);
201impl_encode_prim!(f32, write_f32);
202impl_encode_prim!(f64, write_f64);