1use super::JceType;
2use std::collections::{BTreeMap, HashMap};
3
4use bytes::Bytes;
5
6#[derive(Debug, Clone, PartialEq)]
8pub enum JceValue {
9 Bool(bool),
10 U8(u8),
11 I16(i16),
12 I32(i32),
13 I64(i64),
14 F32(f32),
15 F64(f64),
16 String(String),
17 Map(HashMap<JceMapKey, JceValue>),
18 List(Vec<JceValue>),
19 Struct(JceStruct),
20 Empty,
21 Bytes(Bytes),
22}
23
24impl super::JceGet for JceValue {
25 fn jce_get<B: bytes::Buf + ?Sized>(jce: &mut crate::de::Jce<B>) -> crate::JceResult<Self> {
26 match jce.head.ty {
27 JceType::Bool => Ok(Self::Bool(bool::jce_get(jce)?)),
28 JceType::U8 => Ok(Self::U8(u8::jce_get(jce)?)),
29 JceType::I16 => Ok(Self::I16(i16::jce_get(jce)?)),
30 JceType::I32 => Ok(Self::I32(i32::jce_get(jce)?)),
31 JceType::I64 => Ok(Self::I64(i64::jce_get(jce)?)),
32 JceType::F32 => Ok(Self::F32(f32::jce_get(jce)?)),
33 JceType::F64 => Ok(Self::F64(f64::jce_get(jce)?)),
34 JceType::ShortString | JceType::LongString => Ok(Self::String(String::jce_get(jce)?)),
35 JceType::Map => Ok(Self::Map(HashMap::<JceMapKey, JceValue>::jce_get(jce)?)),
36 JceType::List => Ok(Self::List(Vec::<JceValue>::jce_get(jce)?)),
37 JceType::Struct => Ok(Self::Struct(JceStruct::jce_get(jce)?)),
38 JceType::Empty => Ok(Self::Empty),
39 JceType::Bytes => Ok(Self::Bytes(Bytes::jce_get(jce)?)),
40 _ => panic!("head: {:?}", jce.head), }
42 }
43
44 fn empty() -> crate::JceResult<Self> {
45 Ok(JceValue::Empty)
46 }
47}
48
49#[derive(Debug, Clone, PartialEq, Eq, Hash)]
51pub enum JceMapKey {
52 String(String),
53 Byte(u8),
54 I16(i16),
55 I32(i32),
56 I64(i64),
57}
58
59impl super::JceGet for JceMapKey {
60 fn jce_get<B: bytes::Buf + ?Sized>(jce: &mut crate::de::Jce<B>) -> crate::JceResult<Self> {
61 match jce.head.ty {
62 JceType::U8 => Ok(Self::Byte(u8::jce_get(jce)?)),
63 JceType::I16 => Ok(Self::I16(i16::jce_get(jce)?)),
64 JceType::I32 => Ok(Self::I32(i32::jce_get(jce)?)),
65 JceType::I64 => Ok(Self::I64(i64::jce_get(jce)?)),
66 JceType::ShortString | JceType::LongString => Ok(Self::String(String::jce_get(jce)?)),
67 _ => panic!(), }
69 }
70
71 fn empty() -> crate::JceResult<Self> {
72 panic!() }
74}
75
76pub type JceStruct = BTreeMap<u8, JceValue>;
78
79impl super::JceGet for JceStruct {
80 fn jce_get<B: bytes::Buf + ?Sized>(jce: &mut crate::de::Jce<B>) -> crate::JceResult<Self> {
81 let mut map = BTreeMap::new();
82 while jce.has_remaining() {
83 jce.read_head();
84 let tag = jce.head.tag;
85 if jce.head.ty == JceType::StructEnd {
86 break;
87 }
88 let value = JceValue::jce_get(jce)?;
89 map.insert(tag, value);
90 }
91 Ok(map)
92 }
93
94 fn empty() -> crate::JceResult<Self> {
95 Ok(BTreeMap::default())
96 }
97}