jcers/
value.rs

1use super::JceType;
2use std::collections::{BTreeMap, HashMap};
3
4use bytes::Bytes;
5
6/// Value type covers all types in jce
7#[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), //todo
41        }
42    }
43
44    fn empty() -> crate::JceResult<Self> {
45        Ok(JceValue::Empty)
46    }
47}
48
49/// Key type for jce map
50#[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!(), //todo
68        }
69    }
70
71    fn empty() -> crate::JceResult<Self> {
72        panic!() // todo
73    }
74}
75
76/// Struct type for jce
77pub 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}