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
23impl<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}