bucky_objects/objects/
object_type.rs

1use crate::*;
2
3use std::str::FromStr;
4
5#[derive(Clone, Eq, PartialEq, Debug)]
6#[repr(u8)]
7pub enum ObjectTypeCode {
8    Device = 1,
9    People = 2,
10    Group = 3,
11    AppGroup = 5,
12    UnionAccount = 6,
13    Chunk = 7,
14    File = 8,
15    Dir = 9,
16    Diff = 10,
17    ProofOfService = 11,
18    Tx = 12,
19    Action = 13,
20    ObjectMap = 14,
21    Contract = 15,
22    Custom = 16,
23}
24
25impl From<u16> for ObjectTypeCode {
26    fn from(v: u16) -> Self {
27        match v {
28            1u16 => ObjectTypeCode::Device,
29            2u16 => ObjectTypeCode::People,
30            3u16 => ObjectTypeCode::Group,
31            5u16 => ObjectTypeCode::AppGroup,
32            6u16 => ObjectTypeCode::UnionAccount,
33            7u16 => ObjectTypeCode::Chunk,
34            8u16 => ObjectTypeCode::File,
35            9u16 => ObjectTypeCode::Dir,
36            10u16 => ObjectTypeCode::Diff,
37            11u16 => ObjectTypeCode::ProofOfService,
38            12u16 => ObjectTypeCode::Tx,
39            13u16 => ObjectTypeCode::Action,
40            14u16 => ObjectTypeCode::ObjectMap,
41            15u16 => ObjectTypeCode::Contract,
42            16u16 => ObjectTypeCode::Custom,
43            _ => ObjectTypeCode::Custom,
44        }
45    }
46}
47
48impl From<&ObjectTypeCode> for u16 {
49    fn from(v: &ObjectTypeCode) -> Self {
50        match v {
51            ObjectTypeCode::Device => 1u16,
52            ObjectTypeCode::People => 2u16,
53            ObjectTypeCode::Group => 3u16,
54            ObjectTypeCode::AppGroup => 5u16,
55            ObjectTypeCode::UnionAccount => 6u16,
56            ObjectTypeCode::Chunk => 7u16,
57            ObjectTypeCode::File => 8u16,
58            ObjectTypeCode::Dir => 9u16,
59            ObjectTypeCode::Diff => 10u16,
60            ObjectTypeCode::ProofOfService => 11u16,
61            ObjectTypeCode::Tx => 12u16,
62            ObjectTypeCode::Action => 13u16,
63            ObjectTypeCode::ObjectMap => 14u16,
64            ObjectTypeCode::Contract => 15u16,
65            _ => 16u16,
66        }
67    }
68}
69
70impl From<ObjectTypeCode> for u16 {
71    fn from(v: ObjectTypeCode) -> Self {
72        let r = &v;
73        r.into()
74    }
75}
76
77impl ObjectTypeCode {
78    pub fn raw_check_type_code(buf: &[u8]) -> Self {
79        let flag = buf[0];
80        if (flag >> 6) != 0b_00000001 {
81            ObjectTypeCode::Custom
82        } else {
83            let obj_type_code = (flag << 2 >> 4) as u16;
84            obj_type_code.into()
85        }
86    }
87
88    pub fn to_u16(&self) -> u16 {
89        self.into()
90    }
91
92    pub fn to_u8(&self) -> u8 {
93        self.to_u16() as u8
94    }
95}
96
97impl FromStr for ObjectTypeCode {
98    type Err = BuckyError;
99    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
100        let v: u16 = s.parse().map_err(|e| {
101            warn!("parse object type code error: {} {}", s, e);
102            BuckyError::from(BuckyErrorCode::InvalidFormat)
103        })?;
104
105        Ok(v.into())
106    }
107}
108
109impl ToString for ObjectTypeCode {
110    fn to_string(&self) -> String {
111        let v: u16 = self.into();
112        v.to_string()
113    }
114}
115
116impl RawEncode for ObjectTypeCode {
117    fn raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
118        Ok(u16::raw_bytes().unwrap())
119    }
120
121    fn raw_encode<'a>(
122        &self,
123        buf: &'a mut [u8],
124        purpose: &Option<RawEncodePurpose>,
125    ) -> BuckyResult<&'a mut [u8]> {
126        let v: u16 = self.into();
127        v.raw_encode(buf, purpose)
128    }
129}
130
131impl<'de> RawDecode<'de> for ObjectTypeCode {
132    fn raw_decode(buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
133        let (v, buf) = u16::raw_decode(buf).map_err(|e| {
134            log::error!("ObjectTypeCode::raw_decode error:{}", e);
135            e
136        })?;
137        let v = v.into();
138
139        Ok((v, buf))
140    }
141}
142
143pub mod object_type_helper {
144    use super::*;
145
146    pub fn is_standard_object(object_type: u16) -> bool {
147        object_type >= OBJECT_TYPE_STANDARD_START && object_type <= OBJECT_TYPE_STANDARD_END
148    }
149
150    pub fn is_custom_object(object_type: u16) -> bool {
151        object_type >= OBJECT_TYPE_CORE_START
152    }
153
154    pub fn is_core_object(object_type: u16) -> bool {
155        object_type >= OBJECT_TYPE_CORE_START && object_type <= OBJECT_TYPE_CORE_END
156    }
157
158    pub fn is_dec_app_object(object_type: u16) -> bool {
159        object_type >= OBJECT_TYPE_DECAPP_START && object_type <= OBJECT_TYPE_DECAPP_END
160    }
161}
162
163// object 类型trait的基础,为每种object都要实现这个
164pub trait ObjectType: Clone {
165    // 如果是非标准对象:ObjectTypeCode::Custome
166    fn obj_type_code() -> ObjectTypeCode;
167
168    // 标准对象:obj_type < 17
169    // 核心对象:obj_type >= 17 && obj_type < 2^15
170    // DecApp对象:obj_type >= 2^15 && obj_type < 2^16
171    fn obj_type() -> u16;
172
173    fn is_standard_object() -> bool {
174        let c = Self::obj_type_code();
175        c != ObjectTypeCode::Custom
176    }
177
178    fn is_core_object() -> bool {
179        let t = Self::obj_type();
180        let c = Self::obj_type_code();
181        c == ObjectTypeCode::Custom && object_type_helper::is_core_object(t)
182    }
183
184    fn is_dec_app_object() -> bool {
185        let t = Self::obj_type();
186        let c = Self::obj_type_code();
187        c == ObjectTypeCode::Custom && object_type_helper::is_dec_app_object(t)
188    }
189
190    type DescType: ObjectDesc + Sync + Send;
191    type ContentType: Sync + Send;
192}