bucky_objects/objects/
object_link.rs1use crate::*;
2
3
4#[derive(Clone, Eq, PartialEq, Debug)]
5pub struct ObjectLink {
6 pub obj_id: ObjectId,
7 pub obj_owner: Option<ObjectId>,
8}
9
10impl RawEncode for ObjectLink {
11 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
12 Ok(ObjectId::raw_bytes().unwrap()
13 + self.obj_owner.raw_measure(purpose).map_err(|e| {
14 log::error!("ObjectId::raw_measure error:{}", e);
15 e
16 })?)
17 }
18
19 fn raw_encode<'a>(
20 &self,
21 buf: &'a mut [u8],
22 purpose: &Option<RawEncodePurpose>,
23 ) -> BuckyResult<&'a mut [u8]> {
24 let bytes = self.raw_measure(purpose).unwrap();
25 if buf.len() < bytes {
26 let msg = format!(
27 "not enough buffer for encode ObjectLink, except={}, got={}",
28 bytes,
29 buf.len()
30 );
31 error!("{}", msg);
32
33 return Err(BuckyError::new(BuckyErrorCode::OutOfLimit, msg));
34 }
35
36 let buf = self.obj_id.raw_encode(buf, purpose).map_err(|e| {
37 log::error!("ObjectId::raw_encode/obj_id error:{}", e);
38 e
39 })?;
40
41 let buf = self.obj_owner.raw_encode(buf, purpose).map_err(|e| {
42 log::error!("ObjectId::raw_encode/obj_owner error:{}", e);
43 e
44 })?;
45
46 Ok(buf)
47 }
48}
49
50impl<'de> RawDecode<'de> for ObjectLink {
51 fn raw_decode(buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
52 let (obj_id, buf) = ObjectId::raw_decode(buf).map_err(|e| {
53 log::error!("ObjectId::raw_decode/obj_id error:{}", e);
54 e
55 })?;
56
57 let (obj_owner, buf) = Option::<ObjectId>::raw_decode(buf).map_err(|e| {
58 log::error!("ObjectId::raw_decode/obj_owner error:{}", e);
59 e
60 })?;
61
62 Ok((Self { obj_id, obj_owner }, buf))
63 }
64}