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);