1use alloc::string::String;
4use alloc::vec::Vec;
5use core::fmt::Debug;
6
7use sealed::sealed;
8
9use crate::io::*;
10use crate::varint::*;
11use crate::{EpeeObject, Error, InnerMarker, Marker, Result, MAX_STRING_LEN_POSSIBLE};
12
13#[sealed]
17pub trait EpeeValue: Sized {
18 const MARKER: Marker;
19
20 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self>;
21
22 fn should_write(&self) -> bool {
23 true
24 }
25
26 fn epee_default_value() -> Option<Self> {
32 None
33 }
34
35 fn write<W: Write>(&self, w: &mut W) -> Result<()>;
36}
37
38#[sealed]
39impl<T: EpeeObject> EpeeValue for T {
40 const MARKER: Marker = Marker::new(InnerMarker::Object);
41
42 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
43 if marker != &Self::MARKER {
44 return Err(Error::Format("Marker does not match expected Marker"));
45 }
46
47 let mut skipped_objects = 0;
48 crate::read_object(r, &mut skipped_objects)
49 }
50
51 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
52 write_varint(self.number_of_fields(), w)?;
53 self.write_fields(w)
54 }
55}
56
57#[sealed]
58impl<T: EpeeObject> EpeeValue for Vec<T> {
59 const MARKER: Marker = T::MARKER.into_seq();
60
61 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
62 if !marker.is_seq {
63 return Err(Error::Format(
64 "Marker is not sequence when a sequence was expected",
65 ));
66 }
67 let len = read_varint(r)?;
68
69 let individual_marker = Marker::new(marker.inner_marker.clone());
70
71 let mut res = Vec::with_capacity(len.try_into()?);
72 for _ in 0..len {
73 res.push(T::read(r, &individual_marker)?);
74 }
75 Ok(res)
76 }
77
78 fn should_write(&self) -> bool {
79 !self.is_empty()
80 }
81
82 fn epee_default_value() -> Option<Self> {
83 Some(Vec::new())
84 }
85
86 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
87 write_varint(self.len().try_into()?, w)?;
88 for item in self.iter() {
89 item.write(w)?;
90 }
91 Ok(())
92 }
93}
94
95#[sealed]
96impl<T: EpeeObject + Debug, const N: usize> EpeeValue for [T; N] {
97 const MARKER: Marker = <T>::MARKER.into_seq();
98
99 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
100 let vec = Vec::<T>::read(r, marker)?;
101
102 if vec.len() != N {
103 return Err(Error::Format("Array has incorrect length"));
104 }
105
106 Ok(vec.try_into().unwrap())
107 }
108
109 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
110 write_varint(self.len().try_into()?, w)?;
111 for item in self.iter() {
112 item.write(w)?;
113 }
114 Ok(())
115 }
116}
117
118macro_rules! epee_numb {
119 ($numb:ty, $marker:ident) => {
120 #[sealed]
121 impl EpeeValue for $numb {
122 const MARKER: Marker = Marker::new(InnerMarker::$marker);
123
124 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
125 if marker != &Self::MARKER {
126 return Err(Error::Format("Marker does not match expected Marker"));
127 }
128
129 Ok(<$numb>::from_le_bytes(read_bytes(r)?))
130 }
131
132 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
133 w.write_all(&self.to_le_bytes())
134 }
135 }
136 };
137}
138
139epee_numb!(i64, I64);
140epee_numb!(i32, I32);
141epee_numb!(i16, I16);
142epee_numb!(i8, I8);
143epee_numb!(u8, U8);
144epee_numb!(u16, U16);
145epee_numb!(u32, U32);
146epee_numb!(u64, U64);
147epee_numb!(f64, F64);
148
149#[sealed]
150impl EpeeValue for bool {
151 const MARKER: Marker = Marker::new(InnerMarker::Bool);
152
153 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
154 if marker != &Self::MARKER {
155 return Err(Error::Format("Marker does not match expected Marker"));
156 }
157
158 Ok(read_byte(r)? != 0)
159 }
160
161 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
162 w.write_all(&[if *self { 1 } else { 0 }])
163 }
164}
165
166#[sealed]
167impl EpeeValue for Vec<u8> {
168 const MARKER: Marker = Marker::new(InnerMarker::String);
169
170 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
171 if marker != &Self::MARKER {
172 return Err(Error::Format("Marker does not match expected Marker"));
173 }
174
175 let len = read_varint(r)?;
176 if len > MAX_STRING_LEN_POSSIBLE {
177 return Err(Error::Format("Byte array exceeded max length"));
178 }
179
180 read_var_bytes(r, len.try_into()?)
181 }
182
183 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
184 write_varint(self.len().try_into()?, w)?;
185 w.write_all(self)
186 }
187}
188
189#[sealed]
190impl EpeeValue for String {
191 const MARKER: Marker = Marker::new(InnerMarker::String);
192
193 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
194 if marker != &Self::MARKER {
195 return Err(Error::Format("Marker does not match expected Marker"));
196 }
197
198 let len = read_varint(r)?;
199 if len > MAX_STRING_LEN_POSSIBLE {
200 return Err(Error::Format("String exceeded max length"));
201 }
202
203 read_string(r, len.try_into()?)
204 }
205
206 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
207 write_varint(self.len().try_into()?, w)?;
208 w.write_all(self.as_bytes())
209 }
210}
211
212#[sealed]
213impl<const N: usize> EpeeValue for [u8; N] {
214 const MARKER: Marker = Marker::new(InnerMarker::String);
215
216 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
217 if marker != &Self::MARKER {
218 return Err(Error::Format("Marker does not match expected Marker"));
219 }
220
221 let len = read_varint(r)?;
222 if len != N.try_into()? {
223 return Err(Error::Format("Byte array has incorrect length"));
224 }
225
226 read_bytes(r)
227 }
228
229 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
230 write_varint(self.len().try_into()?, w)?;
231 w.write_all(self)
232 }
233}
234
235#[sealed]
236impl<const N: usize> EpeeValue for Vec<[u8; N]> {
237 const MARKER: Marker = <[u8; N]>::MARKER.into_seq();
238
239 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
240 if !marker.is_seq {
241 return Err(Error::Format(
242 "Marker is not sequence when a sequence was expected",
243 ));
244 }
245
246 let len = read_varint(r)?;
247
248 let individual_marker = Marker::new(marker.inner_marker.clone());
249
250 let mut res = Vec::with_capacity(len.try_into()?);
251 for _ in 0..len {
252 res.push(<[u8; N]>::read(r, &individual_marker)?);
253 }
254 Ok(res)
255 }
256
257 fn should_write(&self) -> bool {
258 !self.is_empty()
259 }
260
261 fn epee_default_value() -> Option<Self> {
262 Some(Vec::new())
263 }
264
265 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
266 write_varint(self.len().try_into()?, w)?;
267 for item in self.iter() {
268 item.write(w)?;
269 }
270 Ok(())
271 }
272}
273
274macro_rules! epee_seq {
275 ($val:ty) => {
276 #[sealed]
277 impl EpeeValue for Vec<$val> {
278 const MARKER: Marker = <$val>::MARKER.into_seq();
279
280 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
281 if !marker.is_seq {
282 return Err(Error::Format(
283 "Marker is not sequence when a sequence was expected",
284 ));
285 }
286
287 let len = read_varint(r)?;
288
289 let individual_marker = Marker::new(marker.inner_marker.clone());
290
291 let mut res = Vec::with_capacity(len.try_into()?);
292 for _ in 0..len {
293 res.push(<$val>::read(r, &individual_marker)?);
294 }
295 Ok(res)
296 }
297
298 fn should_write(&self) -> bool {
299 !self.is_empty()
300 }
301
302 fn epee_default_value() -> Option<Self> {
303 Some(Vec::new())
304 }
305
306 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
307 write_varint(self.len().try_into()?, w)?;
308 for item in self.iter() {
309 item.write(w)?;
310 }
311 Ok(())
312 }
313 }
314
315 #[sealed]
316 impl<const N: usize> EpeeValue for [$val; N] {
317 const MARKER: Marker = <$val>::MARKER.into_seq();
318
319 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
320 let vec = Vec::<$val>::read(r, marker)?;
321
322 if vec.len() != N {
323 return Err(Error::Format("Array has incorrect length"));
324 }
325
326 Ok(vec.try_into().unwrap())
327 }
328
329 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
330 write_varint(self.len().try_into()?, w)?;
331 for item in self.iter() {
332 item.write(w)?;
333 }
334 Ok(())
335 }
336 }
337 };
338}
339
340epee_seq!(i64);
341epee_seq!(i32);
342epee_seq!(i16);
343epee_seq!(i8);
344epee_seq!(u64);
345epee_seq!(u32);
346epee_seq!(u16);
347epee_seq!(f64);
348epee_seq!(bool);
349epee_seq!(Vec<u8>);
350epee_seq!(String);
351
352#[sealed]
353impl<T: EpeeValue> EpeeValue for Option<T> {
354 const MARKER: Marker = T::MARKER;
355
356 fn read<R: Read>(r: &mut R, marker: &Marker) -> Result<Self> {
357 Ok(Some(T::read(r, marker)?))
358 }
359
360 fn should_write(&self) -> bool {
361 match self {
362 Some(t) => t.should_write(),
363 None => false,
364 }
365 }
366
367 fn epee_default_value() -> Option<Self> {
368 Some(None)
369 }
370
371 fn write<W: Write>(&self, w: &mut W) -> Result<()> {
372 match self {
373 Some(t) => t.write(w)?,
374 None => panic!("Can't write an Option::None value, this should be handled elsewhere"),
375 }
376 Ok(())
377 }
378}