bucky_objects/objects/
object_type.rs1use 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
163pub trait ObjectType: Clone {
165 fn obj_type_code() -> ObjectTypeCode;
167
168 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}