1use crate::*;
2
3use std::marker::PhantomData;
4
5pub trait SubDescType: Sized + Sync + Send + Default {
13 fn is_support() -> bool {
14 true
15 }
16 fn is_none(&self) -> bool;
17 fn is_some(&self) -> bool {
18 !self.is_none()
19 }
20 fn inner_raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError>;
21 fn inner_raw_encode<'a>(
22 &self,
23 buf: &'a mut [u8],
24 purpose: &Option<RawEncodePurpose>,
25 ) -> Result<&'a mut [u8], BuckyError>;
26 fn inner_raw_decode<'de>(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError>;
27}
28
29pub trait OwnerObj: SubDescType + Clone {
30 type Inner;
31
32 fn from_type_less(value: Option<ObjectId>) -> BuckyResult<Self>;
33 fn from_inner(inner: Self::Inner) -> Self;
34}
35
36pub trait AreaObj: SubDescType + Clone {
37 type Inner;
38 fn from_type_less(value: Option<Area>) -> BuckyResult<Self>;
39 fn area_ref(&self) -> &Option<Area>;
40 fn from_inner(inner: Self::Inner) -> Self;
41}
42
43pub trait AuthorObj: SubDescType + Clone {
44 type Inner;
45 fn from_type_less(value: Option<ObjectId>) -> BuckyResult<Self>;
46 fn from_inner(inner: Self::Inner) -> Self;
47}
48
49pub trait PublicKeyObj: SubDescType + Clone {
50 fn from_type_less(single: Option<PublicKey>, mn: Option<MNPublicKey>) -> BuckyResult<Self>;
51 fn has_single_key(&self) -> bool;
52 fn has_mn_key(&self) -> bool;
53}
54
55#[derive(Clone, Debug)]
67pub struct SubDescNone();
68
69impl Default for SubDescNone {
70 fn default() -> Self {
71 SubDescNone()
72 }
73}
74
75impl SubDescType for SubDescNone {
76 fn is_support() -> bool {
77 false
78 }
79
80 fn is_none(&self) -> bool {
81 true
82 }
83
84 fn inner_raw_measure(&self, _purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
85 panic!("Should not call here!!!");
86 }
87
88 fn inner_raw_encode<'a>(
89 &self,
90 _buf: &'a mut [u8],
91 _purpose: &Option<RawEncodePurpose>,
92 ) -> Result<&'a mut [u8], BuckyError> {
93 panic!("Should not call here!!!");
94 }
95
96 fn inner_raw_decode<'de>(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
97 Ok((SubDescNone(), buf))
98 }
99}
100
101impl OwnerObj for SubDescNone {
102 type Inner = SubDescNone;
103
104 fn from_type_less(value: Option<ObjectId>) -> BuckyResult<Self> {
105 if value.is_some() {
106 return Err(BuckyError::new(
107 BuckyErrorCode::InvalidData,
108 "owner objectdesc has been implement",
109 ));
110 }
111 Ok(SubDescNone::default())
112 }
113
114 fn from_inner(inner: Self::Inner) -> Self {
115 inner
116 }
117}
118
119impl AreaObj for SubDescNone {
120 type Inner = SubDescNone;
121
122 fn from_type_less(value: Option<Area>) -> BuckyResult<Self> {
123 if value.is_some() {
124 return Err(BuckyError::new(
125 BuckyErrorCode::InvalidData,
126 "area objectdesc has been implement",
127 ));
128 }
129 Ok(SubDescNone::default())
130 }
131
132 fn area_ref(&self) -> &Option<Area> {
133 &None
134 }
135
136 fn from_inner(inner: Self::Inner) -> Self {
137 inner
138 }
139}
140
141impl AuthorObj for SubDescNone {
142 type Inner = SubDescNone;
143
144 fn from_type_less(value: Option<ObjectId>) -> BuckyResult<Self> {
145 if value.is_some() {
146 return Err(BuckyError::new(
147 BuckyErrorCode::InvalidData,
148 "author objectdesc has been implement",
149 ));
150 }
151 Ok(SubDescNone::default())
152 }
153
154 fn from_inner(inner: Self::Inner) -> Self {
155 inner
156 }
157}
158
159impl PublicKeyObj for SubDescNone {
160 fn from_type_less(single: Option<PublicKey>, mn: Option<MNPublicKey>) -> BuckyResult<Self> {
161 if single.is_some() || mn.is_some() {
162 return Err(BuckyError::new(
163 BuckyErrorCode::InvalidData,
164 "public_key objectdesc has been implement",
165 ));
166 }
167 Ok(SubDescNone::default())
168 }
169
170 fn has_single_key(&self) -> bool {
171 false
172 }
173
174 fn has_mn_key(&self) -> bool {
175 false
176 }
177}
178
179impl SubDescType for Option<ObjectId> {
183 fn is_none(&self) -> bool {
184 self.is_none()
185 }
186
187 fn inner_raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
188 assert!(self.is_some());
189 self.unwrap().raw_measure(purpose)
190 }
191
192 fn inner_raw_encode<'a>(
193 &self,
194 buf: &'a mut [u8],
195 purpose: &Option<RawEncodePurpose>,
196 ) -> Result<&'a mut [u8], BuckyError> {
197 assert!(self.is_some());
198 self.unwrap().raw_encode(buf, purpose)
199 }
200
201 fn inner_raw_decode<'de>(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
202 let (id, buf) = ObjectId::raw_decode(buf).map_err(|e| {
203 error!("Option<ObjectId>::inner_raw_decode/id error:{}", e);
204 e
205 })?;
206 Ok((Some(id), buf))
207 }
208}
209
210impl OwnerObj for Option<ObjectId> {
211 type Inner = ObjectId;
212
213 fn from_type_less(value: Option<ObjectId>) -> BuckyResult<Self> {
214 Ok(value)
215 }
216
217 fn from_inner(inner: Self::Inner) -> Self {
218 Some(inner)
219 }
220}
221
222impl AuthorObj for Option<ObjectId> {
223 type Inner = ObjectId;
224
225 fn from_type_less(value: Option<ObjectId>) -> BuckyResult<Self> {
226 Ok(value)
227 }
228
229 fn from_inner(inner: Self::Inner) -> Self {
230 Some(inner)
231 }
232}
233
234impl OwnerObjectDesc for Option<ObjectId> {
235 fn owner(&self) -> &Option<ObjectId> {
236 self
237 }
238}
239
240impl AuthorObjectDesc for Option<ObjectId> {
241 fn author(&self) -> &Option<ObjectId> {
242 self
243 }
244}
245
246impl SubDescType for Option<Area> {
250 fn is_none(&self) -> bool {
251 self.is_none()
252 }
253
254 fn inner_raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
255 assert!(self.is_some());
256 self.as_ref().unwrap().raw_measure(purpose)
257 }
258
259 fn inner_raw_encode<'a>(
260 &self,
261 buf: &'a mut [u8],
262 purpose: &Option<RawEncodePurpose>,
263 ) -> Result<&'a mut [u8], BuckyError> {
264 assert!(self.is_some());
265 self.as_ref().unwrap().raw_encode(buf, purpose)
266 }
267
268 fn inner_raw_decode<'de>(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
269 let (area, buf) = Area::raw_decode(buf).map_err(|e| {
270 error!("Option<Area>::inner_raw_decode/area error:{}", e);
271 e
272 })?;
273 Ok((Some(area), buf))
274 }
275}
276
277impl AreaObj for Option<Area> {
278 type Inner = Area;
279
280 fn from_type_less(value: Option<Area>) -> BuckyResult<Self> {
281 Ok(value)
282 }
283
284 fn area_ref(&self) -> &Option<Area> {
285 self
286 }
287
288 fn from_inner(inner: Self::Inner) -> Self {
289 Some(inner)
290 }
291}
292
293impl AreaObjectDesc for Option<Area> {
294 fn area(&self) -> &Option<Area> {
295 self
296 }
297}
298
299impl SubDescType for PublicKey {
303 fn is_none(&self) -> bool {
304 false
305 }
306
307 fn inner_raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
308 assert!(self.is_some());
309 self.raw_measure(purpose)
310 }
311
312 fn inner_raw_encode<'a>(
313 &self,
314 buf: &'a mut [u8],
315 purpose: &Option<RawEncodePurpose>,
316 ) -> Result<&'a mut [u8], BuckyError> {
317 assert!(self.is_some());
318 self.raw_encode(buf, purpose)
319 }
320
321 fn inner_raw_decode<'de>(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
322 let (key, buf) = PublicKey::raw_decode(buf).map_err(|e| {
323 error!("PublicKey::inner_raw_decode/public_key error:{}", e);
324 e
325 })?;
326 Ok((key, buf))
327 }
328}
329
330impl PublicKeyObj for PublicKey {
331 fn from_type_less(single: Option<PublicKey>, mn: Option<MNPublicKey>) -> BuckyResult<Self> {
332 if mn.is_some() {
333 return Err(BuckyError::new(
334 BuckyErrorCode::InvalidData,
335 "mn_public_key objectdesc has been implement",
336 ));
337 }
338
339 if single.is_none() {
340 return Err(BuckyError::new(
341 BuckyErrorCode::InvalidData,
342 "single_public_key objectdesc has not been implement",
343 ));
344 }
345
346 Ok(single.unwrap())
347 }
348
349 fn has_single_key(&self) -> bool {
350 true
351 }
352
353 fn has_mn_key(&self) -> bool {
354 false
355 }
356}
357
358impl SingleKeyObjectDesc for PublicKey {
359 fn public_key(&self) -> &PublicKey {
360 self
361 }
362}
363
364impl PublicKeyObjectDesc for PublicKey {
365 fn public_key_ref(&self) -> Option<PublicKeyRef> {
366 Some(self.into())
367 }
368}
369
370impl SubDescType for MNPublicKey {
375 fn is_none(&self) -> bool {
376 false
377 }
378
379 fn inner_raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> Result<usize, BuckyError> {
380 assert!(self.is_some());
381 self.raw_measure(purpose)
382 }
383
384 fn inner_raw_encode<'a>(
385 &self,
386 buf: &'a mut [u8],
387 purpose: &Option<RawEncodePurpose>,
388 ) -> Result<&'a mut [u8], BuckyError> {
389 assert!(self.is_some());
390 self.raw_encode(buf, purpose)
391 }
392
393 fn inner_raw_decode<'de>(buf: &'de [u8]) -> Result<(Self, &'de [u8]), BuckyError> {
394 let (key, buf) = MNPublicKey::raw_decode(buf).map_err(|e| {
395 error!("MNPublicKey::inner_raw_decode/mn_public_key error:{}", e);
396 e
397 })?;
398 Ok((key, buf))
399 }
400}
401
402impl PublicKeyObj for MNPublicKey {
403 fn from_type_less(single: Option<PublicKey>, mn: Option<MNPublicKey>) -> BuckyResult<Self> {
404 if single.is_some() {
405 return Err(BuckyError::new(
406 BuckyErrorCode::InvalidData,
407 "single_public_key objectdesc has been implement",
408 ));
409 }
410
411 if mn.is_none() {
412 return Err(BuckyError::new(
413 BuckyErrorCode::InvalidData,
414 "mn_public_key objectdesc has not been implement",
415 ));
416 }
417
418 Ok(mn.unwrap())
419 }
420
421 fn has_single_key(&self) -> bool {
422 false
423 }
424
425 fn has_mn_key(&self) -> bool {
426 true
427 }
428}
429
430impl MNKeyObjectDesc for MNPublicKey {
431 fn mn_public_key(&self) -> &MNPublicKey {
432 self
433 }
434}
435
436impl PublicKeyObjectDesc for MNPublicKey {
437 fn public_key_ref(&self) -> Option<PublicKeyRef> {
438 Some(self.into())
439 }
440}
441
442#[derive(Eq, PartialEq)]
447pub enum DescContentType {
448 Typed,
449 Buffer,
450}
451
452pub trait DescContent {
461 fn obj_type() -> u16;
462
463 fn obj_type_code() -> ObjectTypeCode {
464 Self::obj_type().into()
465 }
466
467 fn desc_content_type() -> DescContentType {
468 DescContentType::Typed
469 }
470
471 fn is_standard_object() -> bool {
472 object_type_helper::is_standard_object(Self::obj_type())
473 }
474
475 fn is_core_object() -> bool {
476 object_type_helper::is_core_object(Self::obj_type())
477 }
478
479 fn is_decapp_object() -> bool {
480 object_type_helper::is_dec_app_object(Self::obj_type())
481 }
482
483 fn debug_info() -> String {
484 String::from("DescContent")
485 }
486
487 fn version(&self) -> u8 {
489 0
490 }
491
492 fn format(&self) -> u8 {
494 OBJECT_CONTENT_CODEC_FORMAT_RAW
495 }
496
497 type OwnerType: OwnerObj;
498 type AreaType: AreaObj;
499 type AuthorType: AuthorObj;
500 type PublicKeyType: PublicKeyObj;
501}
502
503#[derive(Clone, Debug, PartialEq)]
504pub struct NamedObjectDesc<T: DescContent> {
505 obj_type: u16,
507 dec_id: Option<ObjectId>,
508 ref_objects: Option<Vec<ObjectLink>>,
509 prev: Option<ObjectId>,
510 create_timestamp: Option<HashValue>,
511 create_time: Option<u64>,
512 expired_time: Option<u64>,
513 owner: T::OwnerType,
519 area: T::AreaType,
520 author: T::AuthorType,
521 public_key: T::PublicKeyType,
522
523 desc_content: T,
525}
526
527impl<T> ObjectDesc for NamedObjectDesc<T>
532where
533 T: DescContent + RawEncode,
534 T::OwnerType: OwnerObj,
535 T::AreaType: AreaObj,
536 T::AuthorType: AuthorObj,
537 T::PublicKeyType: PublicKeyObj,
538{
539 fn obj_type(&self) -> u16 {
540 self.obj_type
541 }
542
543 fn calculate_id(&self) -> ObjectId {
544 ObjectIdBuilder::new(self, self.obj_type_code())
545 .area(self.area.area_ref().as_ref())
546 .single_key(self.public_key.has_single_key())
547 .mn_key(self.public_key.has_mn_key())
548 .owner(self.owner.is_some())
549 .build()
550 }
551
552 fn dec_id(&self) -> &Option<ObjectId> {
553 &self.dec_id
554 }
555
556 fn ref_objs(&self) -> &Option<Vec<ObjectLink>> {
557 &self.ref_objects
558 }
559
560 fn prev(&self) -> &Option<ObjectId> {
561 &self.prev
562 }
563
564 fn create_timestamp(&self) -> &Option<HashValue> {
565 &self.create_timestamp
566 }
567
568 fn create_time(&self) -> u64 {
569 self.create_time.unwrap_or(0)
571 }
572
573 fn option_create_time(&self) -> Option<u64> {
574 self.create_time
575 }
576
577 fn expired_time(&self) -> Option<u64> {
578 self.expired_time
579 }
580}
581
582impl<T> OwnerObjectDesc for NamedObjectDesc<T>
587where
588 T: DescContent,
589 T::OwnerType: OwnerObjectDesc,
590{
591 fn owner(&self) -> &Option<ObjectId> {
592 self.owner.owner()
593 }
594}
595
596impl OwnerObjectDesc for SubDescNone {
597 fn owner(&self) -> &Option<ObjectId> {
598 &None
599 }
600}
601
602impl<T> AreaObjectDesc for NamedObjectDesc<T>
607where
608 T: DescContent,
609 T::AreaType: AreaObjectDesc,
610{
611 fn area(&self) -> &Option<Area> {
612 self.area.area_ref()
613 }
614}
615
616impl AreaObjectDesc for SubDescNone {
617 fn area(&self) -> &Option<Area> {
618 &None
619 }
620}
621
622impl<T> AuthorObjectDesc for NamedObjectDesc<T>
627where
628 T: DescContent,
629 T::AuthorType: AuthorObjectDesc,
630{
631 fn author(&self) -> &Option<ObjectId> {
632 self.author.author()
633 }
634}
635
636impl AuthorObjectDesc for SubDescNone {
637 fn author(&self) -> &Option<ObjectId> {
638 &None
639 }
640}
641
642impl<T> SingleKeyObjectDesc for NamedObjectDesc<T>
647where
648 T: DescContent,
649 T::PublicKeyType: SingleKeyObjectDesc,
650{
651 fn public_key(&self) -> &PublicKey {
652 self.public_key.public_key()
653 }
654}
655
656impl<T> MNKeyObjectDesc for NamedObjectDesc<T>
661where
662 T: DescContent,
663 T::PublicKeyType: MNKeyObjectDesc,
664{
665 fn mn_public_key(&self) -> &MNPublicKey {
666 self.public_key.mn_public_key()
667 }
668}
669
670impl<T> PublicKeyObjectDesc for NamedObjectDesc<T>
674where
675 T: DescContent,
676 T::PublicKeyType: PublicKeyObjectDesc,
677{
678 fn public_key_ref(&self) -> Option<PublicKeyRef> {
679 self.public_key.public_key_ref()
680 }
681}
682
683impl PublicKeyObjectDesc for SubDescNone {
684 fn public_key_ref(&self) -> Option<PublicKeyRef> {
685 None
686 }
687}
688
689#[derive(Clone)]
694pub struct NamedObjectDescBuilder<T: DescContent> {
695 obj_type: u16,
697 dec_id: Option<ObjectId>,
698 ref_objects: Option<Vec<ObjectLink>>,
699 prev: Option<ObjectId>,
700 create_timestamp: Option<HashValue>,
701 create_time: Option<u64>,
702 expired_time: Option<u64>,
703
704 owner: Option<T::OwnerType>,
706 area: Option<T::AreaType>,
707 author: Option<T::AuthorType>,
708 public_key: Option<T::PublicKeyType>,
709
710 version: u16,
711
712 desc_content: T,
714 }
716
717impl<T: DescContent> NamedObjectDescBuilder<T> {
718 pub fn new(obj_type: u16, t: T) -> Self {
719 Self {
720 obj_type: obj_type,
722 dec_id: None,
723 ref_objects: None,
724 prev: None,
725 create_timestamp: None,
726 create_time: Some(bucky_time_now()),
727 expired_time: None,
728
729 owner: Some(T::OwnerType::default()),
731 area: Some(T::AreaType::default()),
732 author: Some(T::AuthorType::default()),
733 public_key: Some(T::PublicKeyType::default()),
734
735 version: 0,
736
737 desc_content: t,
739 }
740 }
741
742 pub fn desc_content(&self) -> &T {
743 &self.desc_content
744 }
745
746 pub fn mut_desc_content(&mut self) -> &mut T {
747 &mut self.desc_content
748 }
749
750 pub fn dec_id(mut self, value: ObjectId) -> Self {
753 self.dec_id = Some(value);
754 self
755 }
756
757 pub fn option_dec_id(mut self, value: Option<ObjectId>) -> Self {
758 self.dec_id = value;
759 self
760 }
761
762 pub fn ref_objects(mut self, value: Vec<ObjectLink>) -> Self {
763 self.ref_objects = Some(value);
764 self
765 }
766
767 pub fn option_ref_objects(mut self, value: Option<Vec<ObjectLink>>) -> Self {
768 self.ref_objects = value;
769 self
770 }
771
772 pub fn prev(mut self, value: ObjectId) -> Self {
773 self.prev = Some(value);
774 self
775 }
776
777 pub fn option_prev(mut self, value: Option<ObjectId>) -> Self {
778 self.prev = value;
779 self
780 }
781
782 pub fn create_timestamp(mut self, value: HashValue) -> Self {
783 self.create_timestamp = Some(value);
784 self
785 }
786
787 pub fn option_create_timestamp(mut self, value: Option<HashValue>) -> Self {
788 self.create_timestamp = value;
789 self
790 }
791
792 pub fn create_time(mut self, value: u64) -> Self {
793 self.create_time = Some(value);
794 self
795 }
796
797 pub fn option_create_time(mut self, value: Option<u64>) -> Self {
798 self.create_time = value;
799 self
800 }
801
802 pub fn expired_time(mut self, value: u64) -> Self {
803 self.expired_time = Some(value);
804 self
805 }
806
807 pub fn option_expired_time(mut self, value: Option<u64>) -> Self {
808 self.expired_time = value;
809 self
810 }
811
812 pub fn owner(mut self, value: <T::OwnerType as OwnerObj>::Inner) -> Self {
814 self.owner = Some(T::OwnerType::from_inner(value));
815 self
816 }
817
818 pub fn option_owner(mut self, value: T::OwnerType) -> Self {
819 self.owner = Some(value);
820 self
821 }
822
823 pub fn area(mut self, value: <T::AreaType as AreaObj>::Inner) -> Self {
824 self.area = Some(T::AreaType::from_inner(value));
825 self
826 }
827
828 pub fn option_area(mut self, value: T::AreaType) -> Self {
829 self.area = Some(value);
830 self
831 }
832
833 pub fn author(mut self, value: <T::AuthorType as AuthorObj>::Inner) -> Self {
834 self.author = Some(T::AuthorType::from_inner(value));
835 self
836 }
837
838 pub fn option_author(mut self, value: T::AuthorType) -> Self {
839 self.author = Some(value);
840 self
841 }
842
843 pub fn public_key(mut self, value: T::PublicKeyType) -> Self {
844 self.public_key = Some(value);
845 self
846 }
847
848 pub fn option_public_key(mut self, value: Option<T::PublicKeyType>) -> Self {
849 self.public_key = value;
850 self
851 }
852
853 pub fn version(mut self, version: u16) -> Self {
854 self.version = version;
855 self
856 }
857
858 pub fn build(self) -> NamedObjectDesc<T> {
860 NamedObjectDesc::<T> {
861 obj_type: self.obj_type,
862 dec_id: self.dec_id,
863 ref_objects: self.ref_objects,
864 prev: self.prev,
865 create_timestamp: self.create_timestamp,
866 create_time: self.create_time,
867 expired_time: self.expired_time,
868
869 owner: self.owner.unwrap(),
870 area: self.area.unwrap(),
871 author: self.author.unwrap(),
872 public_key: self.public_key.unwrap(),
873
874 desc_content: self.desc_content,
875 }
876 }
877}
878
879impl<T: DescContent> NamedObjectDesc<T> {
883 pub fn new(t: T) -> NamedObjectDescBuilder<T> {
885 NamedObjectDescBuilder::<T>::new(T::obj_type(), t)
886 }
887
888 pub fn content(&self) -> &T {
889 &self.desc_content
890 }
891
892 pub fn content_mut(&mut self) -> &mut T {
893 &mut self.desc_content
894 }
895
896 pub fn into_content(self) -> T {
897 self.desc_content
898 }
899}
900
901impl<T> RawEncodeWithContext<NamedObjectContext> for NamedObjectDesc<T>
906where
907 T: DescContent + RawEncode,
908{
909 fn raw_measure_with_context(
910 &self,
911 ctx: &mut NamedObjectContext,
912 purpose: &Option<RawEncodePurpose>,
913 ) -> BuckyResult<usize> {
914 let mut size = 0;
915
916 if self.dec_id.is_some() {
921 ctx.with_dec_id();
922 size += self.dec_id.unwrap().raw_measure(purpose).map_err(|e|{
923 error!("NamedObjectDesc<T>::raw_measure_with_context/dec_id error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
924 e
925 })?;
926 }
927
928 if self.ref_objects.is_some() {
929 ctx.with_ref_objects();
930 size = size + self.ref_objects.as_ref().unwrap().raw_measure(purpose).map_err(|e|{
931 error!("NamedObjectDesc<T>::raw_measure_with_context/ref_objects error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
932 e
933 })?;
934 }
935
936 if self.prev.is_some() {
937 ctx.with_prev();
938 size = size + self.prev.unwrap().raw_measure(purpose).map_err(|e|{
939 error!("NamedObjectDesc<T>::raw_measure_with_context/prev error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
940 e
941 })?;
942 }
943
944 if self.create_timestamp.is_some() {
945 ctx.with_create_timestamp();
946 size = size + self.create_timestamp.unwrap().raw_measure(purpose).map_err(|e|{
947 error!("NamedObjectDesc<T>::raw_measure_with_context/create_timestamp error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
948 e
949 })?;
950 }
951
952 if self.create_time.is_some() {
953 ctx.with_create_time();
954 size = size + u64::raw_bytes().unwrap();
955 }
956
957 if self.expired_time.is_some() {
958 ctx.with_expired_time();
959 size = size + self.expired_time.unwrap().raw_measure(purpose).map_err(|e|{
960 error!("NamedObjectDesc<T>::raw_measure_with_context/expired_time error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
961 e
962 })?;
963 }
964
965 if self.owner.is_some() {
970 ctx.with_owner();
971 size = size + self.owner.inner_raw_measure(purpose).map_err(|e|{
972 error!("NamedObjectDesc<T>::raw_measure_with_context/owner error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
973 e
974 })?;
975 }
976
977 if self.area.is_some() {
978 ctx.with_area();
979 size = size + self.area.inner_raw_measure(purpose).map_err(|e|{
980 error!("NamedObjectDesc<T>::raw_measure_with_context/area error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
981 e
982 })?;
983 }
984 if self.author.is_some() {
985 ctx.with_author();
986 size = size + self.author.inner_raw_measure(purpose).map_err(|e|{
987 error!("NamedObjectDesc<T>::raw_measure_with_context/author error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
988 e
989 })?;
990 }
991
992 if self.public_key.is_some() {
993 ctx.with_public_key();
994 size = size + u8::raw_bytes().unwrap();
995 size = size + self.public_key.inner_raw_measure(purpose).map_err(|e|{
996 error!("NamedObjectDesc<T>::raw_measure_with_context/public_key error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
997 e
998 })?;
999 }
1000
1001 size += u16::raw_bytes().unwrap();
1003
1004 let desc_content_usize = self.desc_content.raw_measure(purpose).map_err(|e|{
1006 error!("NamedObjectDesc<T>::raw_measure_with_context/desc_content error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1007 e
1008 })?;
1009 if desc_content_usize > u16::MAX as usize {
1010 let msg = format!(
1011 "desc content encode length extend max limit! len={}, max={}",
1012 desc_content_usize,
1013 u16::MAX
1014 );
1015 error!("{}", msg);
1016
1017 return Err(BuckyError::new(BuckyErrorCode::OutOfLimit, msg));
1018 }
1019
1020 size += u16::raw_bytes().unwrap();
1021 size += desc_content_usize;
1022
1023 ctx.cache_desc_content_size(desc_content_usize as u16);
1025
1026 Ok(size)
1027 }
1028
1029 fn raw_encode_with_context<'a>(
1031 &self,
1032 buf: &'a mut [u8],
1033 ctx: &mut NamedObjectContext,
1034 purpose: &Option<RawEncodePurpose>,
1035 ) -> BuckyResult<&'a mut [u8]> {
1036 let mut buf = buf;
1047 if self.dec_id.is_some() {
1048 buf = self.dec_id.unwrap().raw_encode(buf, purpose).map_err(|e|{
1049 error!("NamedObjectDesc<T>::raw_encode_with_context/dec_id error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1050 e
1051 })?;
1052 }
1053
1054 if self.ref_objects.is_some() {
1055 buf = self.ref_objects.as_ref().unwrap().raw_encode(buf, purpose).map_err(|e|{
1056 error!("NamedObjectDesc<T>::raw_encode_with_context/ref_objects error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1057 e
1058 })?;
1059 }
1060
1061 if self.prev.is_some() {
1062 buf = self.prev.unwrap().raw_encode(buf, purpose).map_err(|e|{
1063 error!("NamedObjectDesc<T>::raw_encode_with_context/prev error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1064 e
1065 })?;
1066 }
1067
1068 if self.create_timestamp.is_some() {
1069 buf = self.create_timestamp.unwrap().raw_encode(buf, purpose).map_err(|e|{
1070 error!("NamedObjectDesc<T>::raw_encode_with_context/create_timestamp error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1071 e
1072 })?;
1073 }
1074
1075 if self.create_time.is_some() {
1076 buf = self.create_time.unwrap().raw_encode(buf, purpose).map_err(|e|{
1077 error!("NamedObjectDesc<T>::raw_encode_with_context/create_time error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1078 e
1079 })?;
1080 }
1081
1082 if self.expired_time.is_some() {
1083 buf = self.expired_time.unwrap().raw_encode(buf, purpose).map_err(|e|{
1084 error!("NamedObjectDesc<T>::raw_encode_with_context/expired_time error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1085 e
1086 })?;
1087 }
1088
1089 if self.owner.is_some() {
1092 buf = self.owner.inner_raw_encode(buf, purpose).map_err(|e|{
1093 error!("NamedObjectDesc<T>::raw_encode_with_context/owner error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1094 e
1095 })?;
1096 }
1097
1098 if self.area.is_some() {
1099 buf = self.area.inner_raw_encode(buf, purpose).map_err(|e|{
1100 error!("NamedObjectDesc<T>::raw_encode_with_context/area error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1101 e
1102 })?;
1103 }
1104
1105 if self.author.is_some() {
1106 buf = self.author.inner_raw_encode(buf, purpose).map_err(|e|{
1107 error!("NamedObjectDesc<T>::raw_encode_with_context/inner_raw_encode error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1108 e
1109 })?;
1110 }
1111
1112 if self.public_key.is_some() {
1113 let key_type: u8 = if self.public_key.has_single_key() {
1114 OBJECT_PUBLIC_KEY_SINGLE
1115 } else if self.public_key.has_mn_key() {
1116 OBJECT_PUBLIC_KEY_MN
1117 } else {
1118 OBJECT_PUBLIC_KEY_NONE
1119 };
1120 buf = key_type.raw_encode(buf, purpose).map_err(|e|{
1121 error!("NamedObjectDesc<T>::raw_encode_with_context/key_type error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1122 e
1123 })?;
1124
1125 buf = self.public_key.inner_raw_encode(buf, purpose).map_err(|e|{
1126 error!("NamedObjectDesc<T>::raw_encode_with_context/public_key error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1127 e
1128 })?;
1129 }
1130
1131 buf = self.desc_content.version().raw_encode(buf, purpose).map_err(|e|{
1133 error!("NamedObjectDesc<T>::raw_encode_with_context/version error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1134 e
1135 })?;
1136
1137 buf = self.desc_content.format().raw_encode(buf, purpose).map_err(|e|{
1139 error!("NamedObjectDesc<T>::raw_encode_with_context/format error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1140 e
1141 })?;
1142
1143 let desc_content_size = ctx.get_desc_content_cached_size();
1146 let buf = desc_content_size.raw_encode(buf, purpose).map_err(|e|{
1147 error!("NamedObjectDesc<T>::raw_encode_with_context/desc_content_size error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1148 e
1149 })?;
1150
1151 let buf = self.desc_content.raw_encode(buf, purpose).map_err(|e|{
1152 error!("NamedObjectDesc<T>::raw_encode_with_context/desc_content error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1153 e
1154 })?;
1155
1156 Ok(buf)
1157 }
1158}
1159
1160impl<T> RawEncode for NamedObjectDesc<T>
1166where
1167 T: DescContent + RawEncode,
1168{
1169 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
1170 let mut ctx = NamedObjectContext::new(self.obj_type, 0);
1171 let size = ctx.raw_measure(purpose).map_err(|e|{
1172 error!("NamedObjectDesc<T>::raw_measure/ctx error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1173 e
1174 })?
1175 + self.raw_measure_with_context(&mut ctx, purpose).map_err(|e|{
1176 error!("NamedObjectDesc<T>::raw_measure/raw_measure_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1177 e
1178 })?;
1179
1180 Ok(size)
1181 }
1182
1183 fn raw_encode<'a>(
1185 &self,
1186 buf: &'a mut [u8],
1187 purpose: &Option<RawEncodePurpose>,
1188 ) -> BuckyResult<&'a mut [u8]> {
1189 let mut ctx = NamedObjectContext::new(self.obj_type, 0);
1190
1191 let size = self.raw_measure_with_context(&mut ctx, purpose).map_err(|e|{
1192 error!("NamedObjectDesc<T>::raw_encode/raw_measure_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1193 e
1194 })?;
1195
1196 assert!(buf.len() >= size);
1197
1198 let buf = ctx.raw_encode(buf, purpose).map_err(|e|{
1199 error!("NamedObjectDesc<T>::raw_encode/ctx.raw_encode error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1200 e
1201 })?;
1202
1203 let buf = self.raw_encode_with_context(buf, &mut ctx, purpose).map_err(|e|{
1204 error!("NamedObjectDesc<T>::raw_encode/self.raw_encode_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1205 e
1206 })?;
1207
1208 Ok(buf)
1209 }
1210
1211 fn raw_encode_to_buffer(&self) -> BuckyResult<Vec<u8>> {
1212 let mut ctx = NamedObjectContext::new(self.obj_type, 0);
1213 let size = ctx.raw_measure(&None).map_err(|e|{
1214 error!("NamedObjectDesc<T>::raw_measure/ctx error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1215 e
1216 })? + self.raw_measure_with_context(&mut ctx, &None).map_err(|e|{
1217 error!("NamedObjectDesc<T>::raw_measure/raw_measure_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1218 e
1219 })?;
1220
1221 let mut buf = vec![0u8; size];
1222 let left_buf = ctx.raw_encode(&mut buf, &None).map_err(|e|{
1223 error!("NamedObjectDesc<T>::raw_encode/ctx.raw_encode error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1224 e
1225 })?;
1226
1227 let left_buf = self.raw_encode_with_context(left_buf, &mut ctx, &None).map_err(|e|{
1228 error!("NamedObjectDesc<T>::raw_encode/self.raw_encode_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1229 e
1230 })?;
1231 assert!(left_buf.len() == 0);
1232
1233 Ok(buf)
1234 }
1235
1236 fn raw_hash_encode(&self) -> BuckyResult<Vec<u8>> {
1237 let mut ctx = NamedObjectContext::new(self.obj_type, 0);
1238 let size = ctx.raw_measure(&Some(RawEncodePurpose::Hash)).map_err(|e|{
1239 error!("NamedObjectDesc<T>::raw_hash_encode/ctx.raw_measure error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1240 e
1241 })? + self.raw_measure_with_context(&mut ctx, &Some(RawEncodePurpose::Hash)).map_err(|e|{
1242 error!("NamedObjectDesc<T>::raw_hash_encode/raw_measure_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1243 e
1244 })?;
1245
1246 let mut buf = vec![0u8; size];
1247 let left_buf = ctx.raw_encode(&mut buf, &Some(RawEncodePurpose::Hash)).map_err(|e|{
1248 error!("NamedObjectDesc<T>::raw_encode/ctx.raw_encode error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1249 e
1250 })?;
1251
1252 let left_buf = self.raw_encode_with_context(left_buf, &mut ctx, &Some(RawEncodePurpose::Hash)).map_err(|e|{
1253 error!("NamedObjectDesc<T>::raw_hash_encode/raw_encode_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1254 e
1255 })?;
1256 assert!(left_buf.len() == 0);
1257
1258 Ok(buf)
1260 }
1261}
1262
1263impl<'de, T> RawDecode<'de> for NamedObjectDesc<T>
1264where
1265 T: DescContent + RawDecode<'de>,
1266{
1267 fn raw_decode(buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
1268 let (ctx, buf) = NamedObjectContext::raw_decode(buf).map_err(|e| {
1269 error!(
1270 "NamedObjectDesc<T>::raw_decode/ctx error:{}, obj_type:{}, obj_type_code:{:?}",
1271 e,
1272 T::obj_type(),
1273 T::obj_type_code()
1274 );
1275 e
1276 })?;
1277
1278 let (desc, buf) = NamedObjectDesc::<T>::raw_decode_with_context(buf, ctx).map_err(|e|{
1279 error!("NamedObjectDesc<T>::raw_decode/self.raw_decode_with_context error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1280 e
1281 })?;
1282
1283 Ok((desc, buf))
1284 }
1285}
1286
1287impl<'de, T> RawDecodeWithContext<'de, NamedObjectContext> for NamedObjectDesc<T>
1292where
1293 T: DescContent + RawDecode<'de>,
1294{
1295 fn raw_decode_with_context(
1296 buf: &'de [u8],
1297 ctx: NamedObjectContext,
1298 ) -> BuckyResult<(Self, &'de [u8])> {
1299 let obj_type = ctx.obj_type();
1300 let (dec_id, buf) = if ctx.has_dec_id() {
1305 ObjectId::raw_decode(buf).map(|(v,buf)|{
1306 (Some(v), buf)
1307 }).map_err(|e|{
1308 error!("NamedObjectDesc<T>::raw_decode_with_context/dec_id error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1309 e
1310 })?
1311 } else {
1312 (None, buf)
1313 };
1314
1315 let (ref_objects, buf) = if ctx.has_ref_objects() {
1316 Vec::<ObjectLink>::raw_decode(buf).map(|(v,buf)|{
1317 (Some(v), buf)
1318 }).map_err(|e|{
1319 error!("NamedObjectDesc<T>::raw_decode_with_context/ref_objects error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1320 e
1321 })?
1322 } else {
1323 (None, buf)
1324 };
1325
1326 let (prev, buf) = if ctx.has_prev() {
1327 ObjectId::raw_decode(buf).map(|(v,buf)|{
1328 (Some(v), buf)
1329 }).map_err(|e|{
1330 error!("NamedObjectDesc<T>::raw_decode_with_context/prev error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1331 e
1332 })?
1333 } else {
1334 (None, buf)
1335 };
1336
1337 let (create_timestamp, buf) = if ctx.has_create_time_stamp() {
1338 HashValue::raw_decode(buf).map(|(v,buf)|{
1339 (Some(v), buf)
1340 }).map_err(|e|{
1341 error!("NamedObjectDesc<T>::raw_decode_with_context/create_timestamp error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1342 e
1343 })?
1344 } else {
1345 (None, buf)
1346 };
1347
1348 let (create_time, buf) = if ctx.has_create_time() {
1349 u64::raw_decode(buf).map(|(v,buf)|{
1350 (Some(v), buf)
1351 }).map_err(|e|{
1352 error!("NamedObjectDesc<T>::raw_decode_with_context/create_time error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1353 e
1354 })?
1355 } else {
1356 (None, buf)
1357 };
1358
1359 let (expired_time, buf) = if ctx.has_expired_time() {
1360 u64::raw_decode(buf).map(|(v,buf)|{
1361 (Some(v), buf)
1362 }).map_err(|e|{
1363 error!("NamedObjectDesc<T>::raw_decode_with_context/expired_time error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1364 e
1365 })?
1366 } else {
1367 (None, buf)
1368 };
1369
1370 let (owner, buf) = if ctx.has_owner() {
1374 if !T::OwnerType::is_support() {
1375 let msg = format!("owner field not support for object type={}", obj_type);
1376 error!("{}", msg);
1377 return Err(BuckyError::new(BuckyErrorCode::InvalidData, msg));
1378 }
1379
1380 T::OwnerType::inner_raw_decode(buf).map_err(|e|{
1381 error!("NamedObjectDesc<T>::raw_decode_with_context/owner error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1382 e
1383 })?
1384 } else {
1385 (T::OwnerType::default(), buf)
1386 };
1387
1388 let (area, buf) = if ctx.has_area() {
1389 if !T::AreaType::is_support() {
1390 let msg = format!("area field not support for object type={}", obj_type);
1391 error!("{}", msg);
1392 return Err(BuckyError::new(BuckyErrorCode::InvalidData, msg));
1393 }
1394
1395 T::AreaType::inner_raw_decode(buf).map_err(|e|{
1396 error!("NamedObjectDesc<T>::raw_decode_with_context/area error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1397 e
1398 })?
1399 } else {
1400 (T::AreaType::default(), buf)
1401 };
1402
1403 let (author, buf) = if ctx.has_author() {
1404 if !T::AuthorType::is_support() {
1405 let msg = format!("author field not support for object type={}", obj_type);
1406 error!("{}", msg);
1407 return Err(BuckyError::new(BuckyErrorCode::InvalidData, msg));
1408 }
1409
1410 T::AuthorType::inner_raw_decode(buf).map_err(|e|{
1411 error!("NamedObjectDesc<T>::raw_decode_with_context/author error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1412 e
1413 })?
1414 } else {
1415 (T::AuthorType::default(), buf)
1416 };
1417
1418 let (public_key, buf) = if ctx.has_public_key() {
1419 if !T::PublicKeyType::is_support() {
1420 let msg = format!("public key field not support for object type={}", obj_type);
1421 error!("{}", msg);
1422 return Err(BuckyError::new(BuckyErrorCode::InvalidData, msg));
1423 }
1424
1425 let (_key_type, buf) = u8::raw_decode(buf).map_err(|e|{
1426 error!("NamedObjectDesc<T>::raw_decode/_key_type error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1427 e
1428 })?;
1429
1430 T::PublicKeyType::inner_raw_decode(buf).map_err(|e|{
1431 error!("NamedObjectDesc<T>::raw_decode_with_context/T::PublicKeyType error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1432 e
1433 })?
1434 } else {
1435 (T::PublicKeyType::default(), buf)
1436 };
1437
1438 let buf = if ctx.has_ext() {
1440 let (len, buf) = u16::raw_decode(buf).map_err(|e| {
1441 error!(
1442 "NamedObjectDesc<T>::raw_decode/ext error:{}, obj_type:{}, obj_type_code:{:?}",
1443 e,
1444 T::obj_type(),
1445 T::obj_type_code()
1446 );
1447 e
1448 })?;
1449
1450 warn!(
1452 "read unknown ext content! len={}, obj_type:{}, obj_type_code:{:?}",
1453 len,
1454 T::obj_type(),
1455 T::obj_type_code()
1456 );
1457
1458 if len as usize > buf.len() {
1459 let msg = format!("read unknown body ext content but extend buffer limit, obj_type:{}, len={}, buf={}",
1460 T::obj_type(), len, buf.len());
1461 error!("{}", msg);
1462 return Err(BuckyError::new(BuckyErrorCode::OutOfLimit, msg));
1463 }
1464
1465 &buf[len as usize..]
1466 } else {
1467 buf
1468 };
1469
1470 let (version, buf) = u8::raw_decode(buf).map_err(|e| {
1472 error!(
1473 "NamedObjectDesc<T>::raw_decode/version error:{}, obj_type:{}, obj_type_code:{:?}",
1474 e,
1475 T::obj_type(),
1476 T::obj_type_code()
1477 );
1478 e
1479 })?;
1480
1481 let (format, buf) = u8::raw_decode(buf).map_err(|e| {
1483 error!(
1484 "NamedObjectDesc<T>::raw_decode/format error:{}, obj_type:{}, obj_type_code:{:?}",
1485 e,
1486 T::obj_type(),
1487 T::obj_type_code()
1488 );
1489 e
1490 })?;
1491
1492 let opt = RawDecodeOption { version, format };
1493
1494 let (desc_content, buf) = {
1496 let (desc_content_size, buf) = u16::raw_decode(buf).map_err(|e|{
1498 error!("NamedObjectDesc<T>::raw_decode/_desc_content_size error:{}, obj_type:{}, obj_type_code:{:?}", e, T::obj_type(), T::obj_type_code());
1499 e
1500 })?;
1501
1502 let desc_content_size = desc_content_size as usize;
1503 if buf.len() < desc_content_size {
1504 let msg = format!(
1505 "invalid desc content buffer size: expect={}, buf={}",
1506 desc_content_size,
1507 buf.len()
1508 );
1509 error!("{}", msg);
1510 return Err(BuckyError::new(BuckyErrorCode::OutOfLimit, msg));
1511 }
1512
1513 let desc_content_buf = &buf[..desc_content_size];
1515 let (desc_content, left_buf) = T::raw_decode_with_option(desc_content_buf, &opt).map_err(|e| {
1516 error!(
1517 "NamedObjectDesc<T>::raw_decode/content error:{}, obj_type:{}, obj_type_code:{:?}",
1518 e,
1519 T::obj_type(),
1520 T::obj_type_code()
1521 );
1522 e
1523 })?;
1524
1525 if left_buf.len() != 0 {
1526 let msg = format!(
1527 "decode desc content buffer but remaining buf is not empty: obj_type={}, desc_content_size={}, remaining={}",
1528 T::obj_type(),
1529 desc_content_size,
1530 left_buf.len()
1531 );
1532 warn!("{}", msg);
1533 }
1534
1535 (desc_content, &buf[desc_content_size..])
1536 };
1537
1538 Ok((
1539 Self {
1540 obj_type,
1542 dec_id,
1543 ref_objects,
1544 prev,
1545 create_timestamp,
1546 create_time,
1547 expired_time,
1548
1549 owner,
1551 area,
1552 author,
1553 public_key,
1554
1555 desc_content,
1557 },
1558 buf,
1559 ))
1560 }
1561}
1562
1563#[derive(Clone, Debug)]
1564pub struct NamedObjectBase<O>
1565where
1566 O: ObjectType,
1567 O::ContentType: BodyContent,
1568{
1569 desc: O::DescType,
1571 body: Option<ObjectMutBody<O::ContentType, O>>,
1572 signs: ObjectSigns,
1573 nonce: Option<u128>,
1574}
1575
1576pub struct NamedObjectBaseBuilder<O>
1577where
1578 O: ObjectType,
1579 O::ContentType: BodyContent,
1580{
1581 desc: O::DescType,
1582 body: Option<ObjectMutBody<O::ContentType, O>>,
1583 signs: ObjectSigns,
1584 nonce: Option<u128>,
1585}
1586
1587impl<O> NamedObjectBaseBuilder<O>
1588where
1589 O: ObjectType,
1590 O::ContentType: BodyContent,
1591{
1592 pub fn new(desc: O::DescType) -> Self {
1593 Self {
1594 desc: desc,
1595 body: None,
1596 signs: ObjectSigns::default(),
1597 nonce: None,
1598 }
1599 }
1600
1601 pub fn body(mut self, value: ObjectMutBody<O::ContentType, O>) -> Self {
1602 self.body = Some(value);
1603 self
1604 }
1605
1606 pub fn signs(mut self, value: ObjectSigns) -> Self {
1607 self.signs = value;
1608 self
1609 }
1610
1611 pub fn nonce(mut self, value: u128) -> Self {
1612 self.nonce = Some(value);
1613 self
1614 }
1615
1616 pub fn option_nonce(mut self, value: Option<u128>) -> Self {
1617 self.nonce = value;
1618 self
1619 }
1620
1621 pub fn build(self) -> NamedObjectBase<O> {
1624 NamedObjectBase::<O> {
1625 desc: self.desc,
1626 body: self.body,
1627 signs: self.signs,
1628 nonce: self.nonce,
1629 }
1630 }
1631}
1632
1633impl<O> NamedObjectBase<O>
1634where
1635 O: ObjectType,
1636 O::ContentType: BodyContent,
1637{
1638 pub fn new_builder(desc: O::DescType) -> NamedObjectBaseBuilder<O> {
1639 NamedObjectBaseBuilder::<O>::new(desc)
1640 }
1641
1642 pub fn default(desc: O::DescType) -> Self {
1643 Self {
1644 desc,
1645 body: None,
1646 signs: ObjectSigns::default(),
1647 nonce: None,
1648 }
1649 }
1650
1651 pub fn new_desc(desc: O::DescType, signs: ObjectSigns, nonce: Option<u128>) -> Self {
1652 Self {
1653 desc,
1654 body: None,
1655 signs: signs,
1656 nonce: nonce,
1657 }
1658 }
1659
1660 pub fn split(
1669 self,
1670 ) -> (
1671 O::DescType,
1672 Option<ObjectMutBody<O::ContentType, O>>,
1673 ObjectSigns,
1674 Option<u128>,
1675 ) {
1676 let desc = self.desc;
1677 let body = self.body;
1678 let signs = self.signs;
1679 let nonce = self.nonce;
1680
1681 (desc, body, signs, nonce)
1682 }
1683
1684 pub fn into_desc(self) -> O::DescType {
1685 self.desc
1686 }
1687
1688 pub fn into_body(self) -> Option<ObjectMutBody<O::ContentType, O>> {
1689 self.body
1690 }
1691
1692 pub fn get_obj_update_time(&self) -> u64 {
1693 let update_time = match &self.body {
1694 None => 0_u64,
1695 Some(body) => body.update_time(),
1696 };
1697
1698 let latest_sign_time = self.signs.latest_sign_time();
1700
1701 std::cmp::max(update_time, latest_sign_time)
1702 }
1703}
1704
1705impl<O> NamedObject<O> for NamedObjectBase<O>
1706where
1707 O: ObjectType,
1708 O::DescType: RawEncodeWithContext<NamedObjectContext>,
1709 O::ContentType: RawEncode + BodyContent,
1710{
1711 fn obj_flags(&self) -> u16 {
1712 let mut ctx = NamedObjectContext::new(self.desc.obj_type(), 0);
1713 self.raw_measure_with_context(&mut ctx, &None).unwrap();
1714
1715 ctx.obj_flags()
1717 }
1718
1719 fn desc(&self) -> &O::DescType {
1720 &self.desc
1721 }
1722
1723 fn desc_mut(&mut self) -> &mut O::DescType {
1724 &mut self.desc
1725 }
1726
1727 fn body(&self) -> &Option<ObjectMutBody<O::ContentType, O>> {
1728 &self.body
1729 }
1730
1731 fn body_mut(&mut self) -> &mut Option<ObjectMutBody<O::ContentType, O>> {
1732 &mut self.body
1733 }
1734
1735 fn signs(&self) -> &ObjectSigns {
1736 &self.signs
1737 }
1738
1739 fn signs_mut(&mut self) -> &mut ObjectSigns {
1740 &mut self.signs
1741 }
1742
1743 fn nonce(&self) -> &Option<u128> {
1744 &self.nonce
1745 }
1746}
1747
1748impl<O> RawEncodeWithContext<NamedObjectContext> for NamedObjectBase<O>
1749where
1750 O: ObjectType,
1751 O::DescType: RawEncodeWithContext<NamedObjectContext>,
1752 O::ContentType: RawEncode + BodyContent,
1753{
1754 fn raw_measure_with_context(
1755 &self,
1756 ctx: &mut NamedObjectContext,
1757 purpose: &Option<RawEncodePurpose>,
1758 ) -> BuckyResult<usize> {
1759 let mut size = 0;
1760 size += u32::raw_bytes().unwrap();
1762
1763 size += self.desc().raw_measure_with_context(ctx, purpose).map_err(|e|{
1765 error!("NamedObjectBase<O>::raw_measure_ex/desc error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1766 e
1767 })?;
1768
1769 if self.body().as_ref().is_some() {
1771 ctx.with_mut_body();
1772 size = size + self.body().as_ref().unwrap().raw_measure_with_context(ctx.mut_body_context(), purpose).map_err(|e|{
1773 error!("NamedObjectBase<O>::raw_measure_ex/body error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1774 e
1775 })?;
1776 }
1777
1778 size = size + self.signs().raw_measure_with_context(ctx, purpose).map_err(|e|{
1780 error!("NamedObjectBase<O>::raw_measure_ex/signs error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1781 e
1782 })?;
1783
1784 if self.nonce().as_ref().is_some() {
1786 ctx.with_nonce();
1787 size = size + self.nonce().as_ref().unwrap().raw_measure(purpose).map_err(|e|{
1788 error!("NamedObjectBase<O>::raw_measure_ex/nonce error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1789 e
1790 })?;
1791 }
1792
1793 Ok(size)
1794 }
1795
1796 fn raw_encode_with_context<'a>(
1797 &self,
1798 buf: &'a mut [u8],
1799 ctx: &mut NamedObjectContext,
1800 purpose: &Option<RawEncodePurpose>,
1801 ) -> BuckyResult<&'a mut [u8]> {
1802 let buf = ctx.raw_encode(buf, purpose).map_err(|e|{
1804 error!("NamedObjectBase<O>::raw_encode/raw_measure_ex error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1805 e
1806 })?;
1807
1808 let buf = self
1810 .desc()
1811 .raw_encode_with_context(buf, ctx, purpose)
1812 .unwrap();
1813
1814 let buf = if self.body.is_some() {
1816 self.body.as_ref().unwrap().raw_encode_with_context(buf, ctx.mut_body_context(), purpose).map_err(|e|{
1817 error!("NamedObjectBase<O>::raw_encode/body error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1818 e
1819 })?
1820 } else {
1821 buf
1822 };
1823
1824 let buf = self.signs.raw_encode_with_context(buf, ctx, purpose).map_err(|e|{
1826 error!("NamedObjectBase<O>::raw_encode/signs error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1827 e
1828 })?;
1829
1830 let buf = if self.nonce.is_some() {
1832 self.nonce.as_ref().unwrap().raw_encode(buf, purpose).map_err(|e|{
1833 error!("NamedObjectBase<O>::raw_encode/nonce error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1834 e
1835 })?
1836 } else {
1837 buf
1838 };
1839
1840 Ok(buf)
1841 }
1842}
1843
1844impl<O> RawEncode for NamedObjectBase<O>
1846where
1847 O: ObjectType,
1848 O::DescType: RawEncodeWithContext<NamedObjectContext>,
1849 O::ContentType: RawEncode + BodyContent,
1850{
1851 fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> BuckyResult<usize> {
1852 let mut ctx = NamedObjectContext::new(self.desc.obj_type(), 0);
1853 self.raw_measure_with_context(&mut ctx, purpose)
1854 }
1855
1856 fn raw_encode<'a>(
1857 &self,
1858 buf: &'a mut [u8],
1859 purpose: &Option<RawEncodePurpose>,
1860 ) -> BuckyResult<&'a mut [u8]> {
1861 let mut ctx = NamedObjectContext::new(self.desc.obj_type(), 0);
1862 let size = self.raw_measure_with_context(&mut ctx, purpose)?;
1863
1864 if buf.len() < size {
1865 let message = format!("[raw_encode] not enough buffer for NamedObjectBase, obj_type:{}, obj_type_code:{:?}", O::obj_type(), O::obj_type_code());
1866 return Err(BuckyError::new(BuckyErrorCode::OutOfLimit, message));
1867 }
1868 self.raw_encode_with_context(buf, &mut ctx, purpose)
1869 }
1870
1871 fn raw_encode_to_buffer(&self) -> BuckyResult<Vec<u8>> {
1873 let mut ctx = NamedObjectContext::new(self.desc.obj_type(), 0);
1874 let size = self.raw_measure_with_context(&mut ctx, &None)?;
1875
1876 let mut encode_buf = vec![0u8; size];
1877
1878 let buf = self.raw_encode_with_context(&mut encode_buf, &mut ctx, &None)?;
1879 assert_eq!(buf.len(), 0);
1880
1881 Ok(encode_buf)
1882 }
1883}
1884
1885impl<'de, O> RawDecode<'de> for NamedObjectBase<O>
1887where
1888 O: ObjectType,
1889 O::DescType: RawDecodeWithContext<'de, NamedObjectContext>,
1890 O::ContentType: RawDecode<'de> + BodyContent,
1891{
1892 fn raw_decode(buf: &'de [u8]) -> BuckyResult<(Self, &'de [u8])> {
1893 let (ctx, buf) = NamedObjectContext::raw_decode(buf).map_err(|e| {
1895 error!(
1896 "NamedObjectBase<O>::raw_decode/ctx error:{}, obj_type:{}, obj_type_code:{:?}",
1897 e,
1898 O::obj_type(),
1899 O::obj_type_code()
1900 );
1901 e
1902 })?;
1903
1904 let ctx_ref = &ctx;
1905
1906 if O::obj_type() != OBJECT_TYPE_ANY {
1909 if ctx.obj_type() != O::obj_type() {
1910 let msg = format!(
1911 "obj_type_code not match! required={:?}, got={:?}",
1912 O::obj_type(),
1913 ctx.obj_type()
1914 );
1915 error!("{}", msg);
1916 return Err(BuckyError::new(BuckyErrorCode::Unmatch, msg));
1917 }
1918 }
1919
1920 let (desc, buf) = O::DescType::raw_decode_with_context(buf, ctx.clone()).map_err(|e| {
1922 error!(
1923 "NamedObjectBase<O>::raw_decode/desc error:{}, obj_type:{}, obj_type_code:{:?}",
1924 e,
1925 O::obj_type(),
1926 O::obj_type_code()
1927 );
1928 e
1929 })?;
1930
1931 let (body, buf) = if ctx_ref.has_mut_body() {
1933 let (body, buf) = ObjectMutBody::<O::ContentType, O>::raw_decode_with_context(
1934 buf,
1935 ctx.body_context(),
1936 )
1937 .map_err(|e| {
1938 error!(
1939 "NamedObjectBase<O>::raw_decode/body error:{}, obj_type:{}, obj_type_code:{:?}",
1940 e,
1941 O::obj_type(),
1942 O::obj_type_code()
1943 );
1944 e
1945 })?;
1946 (Some(body), buf)
1947 } else {
1948 (None, buf)
1949 };
1950
1951 let (signs, buf) = ObjectSigns::raw_decode_with_context(buf, ctx_ref).map_err(|e| {
1953 error!(
1954 "NamedObjectBase<O>::raw_decode/signs error:{}, obj_type:{}, obj_type_code:{:?}",
1955 e,
1956 O::obj_type(),
1957 O::obj_type_code()
1958 );
1959 e
1960 })?;
1961
1962 let (nonce, buf) = if ctx_ref.has_nonce() {
1964 let (nonce, buf) = u128::raw_decode(buf).map_err(|e|{
1965 error!("NamedObjectBase<O>::raw_decode/nonce error:{}, obj_type:{}, obj_type_code:{:?}", e, O::obj_type(), O::obj_type_code());
1966 e
1967 })?;
1968 (Some(nonce), buf)
1969 } else {
1970 (None, buf)
1971 };
1972
1973 Ok((
1974 NamedObjectBase::<O> {
1975 desc,
1976 body,
1977 signs,
1978 nonce,
1979 },
1980 buf,
1981 ))
1982 }
1983}
1984
1985pub trait BodyContent {
1987 fn version(&self) -> u8 {
1989 0
1990 }
1991
1992 fn format(&self) -> u8 {
1993 OBJECT_CONTENT_CODEC_FORMAT_RAW
1994 }
1995
1996 fn debug_info() -> String {
1997 String::from("BodyContent")
1998 }
1999}
2000
2001#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
2005pub struct NamedObjType<DC, BC> {
2006 desc_content: Option<PhantomData<DC>>,
2007 body_content: Option<PhantomData<BC>>,
2008}
2009
2010impl<DC, BC> ObjectType for NamedObjType<DC, BC>
2011where
2012 DC: RawEncode + DescContent + Sync + Send + Clone,
2013 BC: Sync + Send + Clone + RawEncode + BodyContent,
2014{
2015 fn obj_type_code() -> ObjectTypeCode {
2016 DC::obj_type_code()
2017 }
2018
2019 fn obj_type() -> u16 {
2020 DC::obj_type()
2021 }
2022
2023 type DescType = NamedObjectDesc<DC>;
2024 type ContentType = BC;
2025}
2026
2027#[derive(Clone)]
2028pub struct NamedObjectBuilder<DC, BC>
2029where
2030 DC: RawEncode + DescContent + Sync + Send + Clone,
2031 BC: Sync + Send + Clone + RawEncode + BodyContent,
2032{
2033 desc_builder: NamedObjectDescBuilder<DC>,
2034 body_builder: ObjectMutBodyBuilder<BC, NamedObjType<DC, BC>>,
2035 signs_builder: ObjectSignsBuilder,
2036 nonce: Option<u128>,
2037}
2038
2039impl<DC, BC> NamedObjectBuilder<DC, BC>
2040where
2041 DC: RawEncode + DescContent + Sync + Send + Clone,
2042 BC: Sync + Send + Clone + RawEncode + BodyContent,
2043{
2044 pub fn new(desc_content: DC, body_content: BC) -> Self {
2045 let desc_builder = NamedObjectDescBuilder::<DC>::new(DC::obj_type(), desc_content);
2046
2047 let body_builder = ObjectMutBodyBuilder::<BC, NamedObjType<DC, BC>>::new(body_content);
2048
2049 let signs_builder = ObjectSignsBuilder::new();
2050
2051 Self {
2052 desc_builder,
2053 body_builder,
2054 signs_builder,
2055 nonce: None,
2056 }
2057 }
2058
2059 pub fn desc_builder(&self) -> &NamedObjectDescBuilder<DC> {
2060 &self.desc_builder
2061 }
2062
2063 pub fn mut_desc_builder(&mut self) -> &mut NamedObjectDescBuilder<DC> {
2064 &mut self.desc_builder
2065 }
2066
2067 pub fn body_builder(&self) -> &ObjectMutBodyBuilder<BC, NamedObjType<DC, BC>> {
2068 &self.body_builder
2069 }
2070
2071 pub fn dec_id(mut self, dec_id: ObjectId) -> Self {
2074 self.desc_builder = self.desc_builder.dec_id(dec_id);
2075 self
2076 }
2077
2078 pub fn option_dec_id(mut self, dec_id: Option<ObjectId>) -> Self {
2079 self.desc_builder = self.desc_builder.option_dec_id(dec_id);
2080 self
2081 }
2082
2083 pub fn ref_objects(mut self, ref_objects: Vec<ObjectLink>) -> Self {
2084 self.desc_builder = self.desc_builder.ref_objects(ref_objects);
2085 self
2086 }
2087
2088 pub fn option_ref_objects(mut self, ref_objects: Option<Vec<ObjectLink>>) -> Self {
2089 self.desc_builder = self.desc_builder.option_ref_objects(ref_objects);
2090 self
2091 }
2092
2093 pub fn prev(mut self, prev: ObjectId) -> Self {
2094 self.desc_builder = self.desc_builder.prev(prev);
2095 self
2096 }
2097
2098 pub fn option_prev(mut self, prev: Option<ObjectId>) -> Self {
2099 self.desc_builder = self.desc_builder.option_prev(prev);
2100 self
2101 }
2102
2103 pub fn create_timestamp(mut self, create_timestamp: HashValue) -> Self {
2104 self.desc_builder = self.desc_builder.create_timestamp(create_timestamp);
2105 self
2106 }
2107
2108 pub fn option_create_timestamp(mut self, create_timestamp: Option<HashValue>) -> Self {
2109 self.desc_builder = self.desc_builder.option_create_timestamp(create_timestamp);
2110 self
2111 }
2112
2113 pub fn no_create_time(mut self) -> Self {
2114 self.desc_builder = self.desc_builder.option_create_time(None);
2115 self
2116 }
2117
2118 pub fn create_time(mut self, create_time: u64) -> Self {
2119 self.desc_builder = self.desc_builder.create_time(create_time);
2120 self
2121 }
2122
2123 pub fn option_create_time(mut self, create_time: Option<u64>) -> Self {
2125 if let Some(time) = create_time {
2126 self.desc_builder = self.desc_builder.create_time(time);
2127 }
2128 self
2129 }
2130
2131 pub fn expired_time(mut self, expired_time: u64) -> Self {
2132 self.desc_builder = self.desc_builder.expired_time(expired_time);
2133 self
2134 }
2135
2136 pub fn option_expired_time(mut self, expired_time: Option<u64>) -> Self {
2137 self.desc_builder = self.desc_builder.option_expired_time(expired_time);
2138 self
2139 }
2140
2141 pub fn owner(mut self, owner: <DC::OwnerType as OwnerObj>::Inner) -> Self {
2144 self.desc_builder = self.desc_builder.owner(owner);
2145 self
2146 }
2147
2148 pub fn option_owner(mut self, owner: DC::OwnerType) -> Self {
2149 self.desc_builder = self.desc_builder.option_owner(owner);
2150 self
2151 }
2152
2153 pub fn area(mut self, area: <DC::AreaType as AreaObj>::Inner) -> Self {
2154 self.desc_builder = self.desc_builder.area(area);
2155 self
2156 }
2157
2158 pub fn option_area(mut self, area: DC::AreaType) -> Self {
2159 self.desc_builder = self.desc_builder.option_area(area);
2160 self
2161 }
2162
2163 pub fn author(mut self, author: <DC::AuthorType as AuthorObj>::Inner) -> Self {
2164 self.desc_builder = self.desc_builder.author(author);
2165 self
2166 }
2167
2168 pub fn option_author(mut self, author: DC::AuthorType) -> Self {
2169 self.desc_builder = self.desc_builder.option_author(author);
2170 self
2171 }
2172
2173 pub fn public_key(mut self, public_key: DC::PublicKeyType) -> Self {
2174 self.desc_builder = self.desc_builder.public_key(public_key);
2175 self
2176 }
2177
2178 pub fn option_public_key(mut self, public_key: Option<DC::PublicKeyType>) -> Self {
2179 self.desc_builder = self.desc_builder.option_public_key(public_key);
2180 self
2181 }
2182
2183 pub fn update_time(mut self, update_time: u64) -> Self {
2186 self.body_builder = self.body_builder.update_time(update_time);
2187 self
2188 }
2189
2190 pub fn prev_version(mut self, prev_version: HashValue) -> Self {
2191 self.body_builder = self.body_builder.prev_version(prev_version);
2192 self
2193 }
2194
2195 pub fn user_data(mut self, user_data: Vec<u8>) -> Self {
2196 self.body_builder = self.body_builder.user_data(user_data);
2197 self
2198 }
2199
2200 pub fn set_desc_sign(mut self, sign: Signature) -> Self {
2203 self.signs_builder = self.signs_builder.set_desc_sign(sign);
2204 self
2205 }
2206
2207 pub fn set_body_sign(mut self, sign: Signature) -> Self {
2208 self.signs_builder = self.signs_builder.set_body_sign(sign);
2209 self
2210 }
2211
2212 pub fn push_desc_sign(mut self, sign: Signature) -> Self {
2213 self.signs_builder = self.signs_builder.push_desc_sign(sign);
2214 self
2215 }
2216
2217 pub fn push_body_sign(mut self, sign: Signature) -> Self {
2218 self.signs_builder = self.signs_builder.push_body_sign(sign);
2219 self
2220 }
2221
2222 pub fn nonce(mut self, nonce: u128) -> Self {
2224 self.nonce = Some(nonce);
2225 self
2226 }
2227
2228 pub fn build(self) -> NamedObjectBase<NamedObjType<DC, BC>> {
2229 let desc = self.desc_builder.build();
2230 let body = self.body_builder.build();
2231 let signs = self.signs_builder.build();
2232
2233 NamedObjectBaseBuilder::new(desc)
2234 .signs(signs)
2235 .body(body)
2236 .option_nonce(self.nonce)
2237 .build()
2238 }
2239}