cyfs_base/objects/
union_account.rs

1use 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    //use std::path::Path;
171
172    #[test]
173    fn union_account() {
174        let account1 = ObjectId::default();
175
176        let account2 = ObjectId::default();
177
178        let service_type = 0; // TODO: 常量定义
179
180        let obj = UnionAccount::new(account1, account2, service_type).build();
181
182        // let p = Path::new("f:\\temp\\union_account.obj");
183        // if p.parent().unwrap().exists() {
184        //     obj.clone().encode_to_file(p, false);
185        // }
186
187        let buf = obj.to_vec().unwrap();
188
189        let _new_obj = UnionAccount::clone_from_slice(&buf).unwrap();
190    }
191}