cyfs_base/objects/
union_account.rs1use crate::*;
2
3use std::convert::TryFrom;
4use serde::Serialize;
5
6#[derive(Clone, Debug, Serialize)]
7pub struct UnionAccountDescContent {
8 left: ObjectId,
9 right: ObjectId,
10 service_type: u8,
11}
12
13impl UnionAccountDescContent {
14 pub fn new(account1: ObjectId, account2: ObjectId, service_type: u8) -> Self {
15 let mut left = account1;
16 let mut right = account2;
17 if account1 > account2 {
18 left = account2;
19 right = account1;
20 }
21
22 Self {
23 left,
24 right,
25 service_type,
26 }
27 }
28
29 pub fn left(&self) -> &ObjectId {
30 &self.left
31 }
32
33 pub fn right(&self) -> &ObjectId {
34 &self.right
35 }
36
37 pub fn service_type(&self) -> u8 {
38 self.service_type
39 }
40}
41
42impl DescContent for UnionAccountDescContent {
43 fn obj_type() -> u16 {
44 ObjectTypeCode::UnionAccount.into()
45 }
46
47 type OwnerType = SubDescNone;
48 type AreaType = SubDescNone;
49 type AuthorType = SubDescNone;
50 type PublicKeyType = SubDescNone;
51}
52
53impl RawEncode for UnionAccountDescContent {
54 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
55 let size =
56 0 + self.left.raw_measure(purpose).map_err(|e| {
57 log::error!("UnionAccountDescContent::raw_measure/left error:{}", e);
58 e
59 })? + self.right.raw_measure(purpose).map_err(|e| {
60 log::error!("UnionAccountDescContent::raw_measure/right error:{}", e);
61 e
62 })? + u8::raw_bytes().unwrap();
63
64 Ok(size)
65 }
66
67 fn raw_encode<'a>(
68 &self,
69 buf: &'a mut [u8],
70 purpose: &Option<RawEncodePurpose>,
71 ) -> Result<&'a mut [u8], BuckyError> {
72 let size = self.raw_measure(purpose).unwrap();
73 if buf.len() < size {
74 return Err(BuckyError::new(
75 BuckyErrorCode::OutOfLimit,
76 "[raw_encode] not enough buffer for UnionAccountDescContent",
77 ));
78 }
79
80 let buf = self.left.raw_encode(buf, purpose).map_err(|e| {
81 log::error!("UnionAccountDescContent::raw_encode/left error:{}", e);
82 e
83 })?;
84
85 let buf = self.right.raw_encode(buf, purpose).map_err(|e| {
86 log::error!("UnionAccountDescContent::raw_encode/right error:{}", e);
87 e
88 })?;
89
90 let buf = self.service_type.raw_encode(buf, purpose).map_err(|e| {
91 log::error!(
92 "UnionAccountDescContent::raw_encode/service_type error:{}",
93 e
94 );
95 e
96 })?;
97
98 Ok(buf)
99 }
100}
101
102impl<'de> RawDecode<'de> for UnionAccountDescContent {
103 fn raw_decode(buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
104 let (left, buf) = ObjectId::raw_decode(buf).map_err(|e| {
105 log::error!("UnionAccountDescContent::raw_decode/left error:{}", e);
106 e
107 })?;
108
109 let (right, buf) = ObjectId::raw_decode(buf).map_err(|e| {
110 log::error!("UnionAccountDescContent::raw_decode/right error:{}", e);
111 e
112 })?;
113
114 let (service_type, buf) = u8::raw_decode(buf).map_err(|e| {
115 log::error!(
116 "UnionAccountDescContent::raw_decode/service_type error:{}",
117 e
118 );
119 e
120 })?;
121
122 Ok((
123 Self {
124 left,
125 right,
126 service_type,
127 },
128 buf,
129 ))
130 }
131}
132
133#[derive(Clone, Debug, RawEncode, RawDecode)]
134pub struct UnionAccountBodyContent {}
135
136impl BodyContent for UnionAccountBodyContent {}
137
138impl UnionAccountBodyContent {
139 pub fn new() -> Self {
140 Self {}
141 }
142}
143
144pub type UnionAccountType = NamedObjType<UnionAccountDescContent, UnionAccountBodyContent>;
145pub type UnionAccountBuilder = NamedObjectBuilder<UnionAccountDescContent, UnionAccountBodyContent>;
146
147pub type UnionAccountDesc = NamedObjectDesc<UnionAccountDescContent>;
148pub type UnionAccountId = NamedObjectId<UnionAccountType>;
149pub type UnionAccount = NamedObjectBase<UnionAccountType>;
150
151impl UnionAccountDesc {
152 pub fn tx_id(&self) -> UnionAccountId {
153 UnionAccountId::try_from(self.calculate_id()).unwrap()
154 }
155}
156
157impl NamedObjectBase<UnionAccountType> {
158 pub fn new(account1: ObjectId, account2: ObjectId, service_type: u8) -> UnionAccountBuilder {
159 let desc_content = UnionAccountDescContent::new(account1, account2, service_type);
160
161 let body_content = UnionAccountBodyContent::new();
162
163 UnionAccountBuilder::new(desc_content, body_content)
164 }
165}
166
167#[cfg(test)]
168mod test {
169 use crate::{ObjectId, RawConvertTo, RawFrom, UnionAccount};
170 #[test]
173 fn union_account() {
174 let account1 = ObjectId::default();
175
176 let account2 = ObjectId::default();
177
178 let service_type = 0; let obj = UnionAccount::new(account1, account2, service_type).build();
181
182 let buf = obj.to_vec().unwrap();
188
189 let _new_obj = UnionAccount::clone_from_slice(&buf).unwrap();
190 }
191}