Skip to main content

cu29_value/
bdec.rs

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