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