cu29_value/
bdec.rs

1use crate::Value;
2use bincode::de::Decoder;
3use bincode::de::{BorrowDecoder, Decode};
4use bincode::error::DecodeError;
5use bincode::BorrowDecode;
6use cu29_clock::CuTime;
7
8#[cfg(not(feature = "std"))]
9mod imp {
10    pub use alloc::boxed::Box;
11    pub use alloc::collections::BTreeMap;
12    pub use alloc::format;
13    pub use alloc::string::String;
14    pub use alloc::vec::Vec;
15}
16#[cfg(feature = "std")]
17mod imp {
18    pub use std::collections::BTreeMap;
19}
20
21use imp::*;
22
23// TODO: Unharcode all those enum types values
24impl<Context> Decode<Context> for Value {
25    fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
26        match u8::decode(decoder)? {
27            0 => Ok(Value::Bool(bool::decode(decoder)?)),
28            1 => Ok(Value::U8(u8::decode(decoder)?)),
29            2 => Ok(Value::U16(u16::decode(decoder)?)),
30            3 => Ok(Value::U32(u32::decode(decoder)?)),
31            4 => Ok(Value::U64(u64::decode(decoder)?)),
32            5 => Ok(Value::I8(i8::decode(decoder)?)),
33            6 => Ok(Value::I16(i16::decode(decoder)?)),
34            7 => Ok(Value::I32(i32::decode(decoder)?)),
35            8 => Ok(Value::I64(i64::decode(decoder)?)),
36            9 => Ok(Value::F32(f32::decode(decoder)?)),
37            10 => Ok(Value::F64(f64::decode(decoder)?)),
38            11 => Ok(Value::Char(char::decode(decoder)?)),
39            12 => Ok(Value::String(String::decode(decoder)?)),
40            13 => Ok(Value::Unit),
41            14 => Ok(Value::Option(Option::<Box<Value>>::decode(decoder)?)),
42            15 => Ok(Value::Newtype(Box::<Value>::decode(decoder)?)),
43            16 => Ok(Value::Seq(Vec::<Value>::decode(decoder)?)),
44            17 => Ok(Value::Map(BTreeMap::<Value, Value>::decode(decoder)?)),
45            18 => Ok(Value::Bytes(Vec::<u8>::decode(decoder)?)),
46            32 => Ok(Value::CuTime(CuTime::decode(decoder)?)),
47            r => Err(DecodeError::OtherString(format!(
48                "Unknown Value variant: {r}"
49            ))),
50        }
51    }
52}
53
54impl<'de, Context> BorrowDecode<'de, Context> for Value {
55    fn borrow_decode<D: BorrowDecoder<'de>>(decoder: &mut D) -> Result<Self, DecodeError> {
56        match u8::borrow_decode(decoder)? {
57            0 => Ok(Value::U8(u8::borrow_decode(decoder)?)),
58            1 => Ok(Value::U16(u16::borrow_decode(decoder)?)),
59            2 => Ok(Value::U32(u32::borrow_decode(decoder)?)),
60            3 => Ok(Value::U64(u64::borrow_decode(decoder)?)),
61            4 => Ok(Value::I8(i8::borrow_decode(decoder)?)),
62            5 => Ok(Value::I16(i16::borrow_decode(decoder)?)),
63            6 => Ok(Value::I32(i32::borrow_decode(decoder)?)),
64            7 => Ok(Value::I64(i64::borrow_decode(decoder)?)),
65            8 => Ok(Value::F32(f32::borrow_decode(decoder)?)),
66            9 => Ok(Value::F64(f64::borrow_decode(decoder)?)),
67            10 => Ok(Value::Bool(bool::borrow_decode(decoder)?)),
68            11 => Ok(Value::Char(char::borrow_decode(decoder)?)),
69            12 => Ok(Value::String(String::borrow_decode(decoder)?)),
70            13 => Ok(Value::Bytes(Vec::<u8>::borrow_decode(decoder)?)),
71            14 => Ok(Value::Unit),
72            15 => Ok(Value::Seq(Vec::<Value>::borrow_decode(decoder)?)),
73            16 => Ok(Value::Map(BTreeMap::<Value, Value>::borrow_decode(
74                decoder,
75            )?)),
76            17 => Ok(Value::Option(Option::<Box<Value>>::borrow_decode(decoder)?)),
77            18 => Ok(Value::Newtype(Box::<Value>::borrow_decode(decoder)?)),
78            r => Err(DecodeError::OtherString(format!(
79                "Unknown Value variant: {r}"
80            ))),
81        }
82    }
83}