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