bucky_objects/objects/
object_impl.rs

1use crate::*;
2
3use std::marker::PhantomData;
4use crate::signature::ObjSignature;
5
6/// 子Desc类型系统
7/// ===
8/// * SubDescType: Sized + Sync + Send
9/// * OwnerObj: SubDescType+Clone
10/// * AreaObj: SubDescType+Clone
11/// * AuthorObj: SubDescType+Clone
12/// * PublicKeyObj: SubDescType+Clone
13pub 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/// 5 种 SubDescType
57/// ====
58/// * SubDescNone      表示不实现某个ObjectDesc
59/// * Option<ObjectId> 用于OwnerObjectDesc或者AuthorObjectDesc
60/// * Option<Area>     用于AreaObjectDesc
61/// * PublicKey        用于SingleKeyObjectDesc
62/// * MNPublicKey      用于MNKeyObjectDesc
63
64/// SubDescNone
65/// ===
66/// 表示不实现某个 XXXObjectDesc
67#[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
180/// Option<ObjectId>
181/// ===
182/// Option<ObjectId> 用于OwnerObjectDesc或者AuthorObjectDesc
183impl 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
247/// Option<ObjectId>
248/// ===
249/// Option<Area>     用于AreaObjectDesc
250impl 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
300/// PublicKey
301/// ===
302/// 用于SingleKeyObjectDesc
303impl 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
371/// MNPublicKey
372/// ===
373/// 用于MNKeyObjectDesc、
374
375impl 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/// DescContent
444/// ====
445/// Desc的用户自定义部分类型,默认是Typed
446/// 如果是Buffer类型,则desc_content部分的size+buffer,都由desc_content自己encode/decode
447#[derive(Eq, PartialEq)]
448pub enum DescContentType {
449    Typed,
450    Buffer,
451}
452
453/// DescContent
454/// ====
455/// Desc的用户自定义部分接口定义
456/// * 提供 fn obj_type() -> u16
457/// * 如果想要实现解码的向前兼容,提供 fn version() -> u16
458/// * 提供 OwnerType/AreaType/AuthorType/PublicKeyType 类型
459///     * 指定 SubDescNone 表示不提供该特性
460///     * 否则指定 其他四种 SubDescType, 参考上面 SubDescType 的说明
461pub 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    // 如果想要实现解码的向前兼容,那么需要覆盖此方法
489    fn version(&self) -> u8 {
490        0
491    }
492
493    // 编码方式,如果想实现非Raw格式的编码,需要覆盖此方法
494    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    // 基本部分 ObjectDesc
507    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    // 通过聚合的方式,保证
515    // 1. NamedObjectDesc 严格控制这些 SubDescType 的二进制内存布局
516    // 2. desc_content 不需要关心如何持有这些 SubDescType 的数据
517    // 3. 如果这些 SubDescType 类型 实现了对应的 XXXObjectDesc,
518    //    则 NamedObjectDesc 自动为他们实现 XXXObjectDesc
519    owner: T::OwnerType,
520    area: T::AreaType,
521    author: T::AuthorType,
522    public_key: T::PublicKeyType,
523
524    // 扩展类型应该只关心自定义字段部分
525    desc_content: T,
526}
527
528/// NamedObjectDesc<T> 的 ObjectDesc 自动实现
529/// ===
530/// 对任意 T: DescContent
531/// 为 NamedObjectDesc<T> 实现 ObjectDesc
532impl<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        // 如果不存在,则返回0
571        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
583/// NamedObjectDesc<T> 的 OwnerObjectDesc 自动实现
584/// ===
585/// 如果 T::OwnerType 实现了 OwnerObjectDesc
586/// 则自动为 NamedObjectDesc<T> 实现 OwnerObjectDesc
587impl<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
603/// NamedObjectDesc<T> 的 AreaObjectDesc 自动实现
604/// ===
605/// 如果 T::AreaType 实现了 AreaObjectDesc
606/// 则自动为 NamedObjectDesc<T> 实现 AreaObjectDesc
607impl<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
623/// NamedObjectDesc<T> 的 AuthorObjectDesc 自动实现
624/// ===
625/// 如果 T::AuthorType 实现了 AuthorObjectDesc
626/// 则自动为 NamedObjectDesc<T> 实现 AuthorObjectDesc
627impl<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
643/// NamedObjectDesc<T> 的 SingleKeyObjectDesc 自动实现
644/// ===
645/// 如果 T::PublicKeyType 实现了 SingleKeyObjectDesc+PublicKeyObjectDesc
646/// 则自动实现 SingleKeyObjectDesc+PublicKeyObjectDesc
647impl<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
657/// NamedObjectDesc<T> 的 MNKeyObjectDesc 自动实现
658/// ===
659/// 如果 T::PublicKeyType 实现了 MNKeyObjectDesc+PublicKeyObjectDesc
660/// 则自动实现了 MNKeyObjectDesc+PublicKeyObjectDesc
661impl<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
671/// NamedObjectDesc<T> 的 PublicKeyObjectDesc 自动实现
672/// ===
673/// SingleKeyObjectDesc 或者  MNKeyObjectDesc 一旦实现了就一定会实现 PublicKeyObjectDesc
674impl<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/// NamedObjectDesc<T> 的 构造器
691/// ===
692/// 通过Builder模式创建BaseObjectDesc<T>
693/// 可选部分通过Builder的方法动态注入
694#[derive(Clone)]
695pub struct NamedObjectDescBuilder<T: DescContent> {
696    // ObjectDesc
697    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/Area/Author/PublicKey
706    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    // DescContent
714    desc_content: T,
715    // obj
716}
717
718impl<T: DescContent> NamedObjectDescBuilder<T> {
719    pub fn new(obj_type: u16, t: T) -> Self {
720        Self {
721            // ObjectDesc
722            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/Area/Author/PublicKey
731            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            // DescContent
739            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    // ObjectDesc
752
753    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    // Owner/Area/Author/PublicKey
814    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    // 构造对象
860    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
880/// NamedObjectDesc<T> 行为定义
881/// ===
882/// * new 返回构造器
883impl<T: DescContent> NamedObjectDesc<T> {
884    // 标准对象
885    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
902/// NamedObjectDesc<T> 的 编码
903/// ===
904/// * ctx: NamedObjectContext 从上层 NamedObjectBase 里传入编码的上下文
905/// * 通过 ctx 压缩Option字段的编码
906impl<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        //
918        // ObjectDesc
919        //
920
921        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        //
967        // OwnderObjectDesc/AreaObjectDesc/AuthorObjectDesc/PublicKeyObjectDesc
968        //
969
970        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        // 新版本起默认带version+format, 16bit
1003        size += u16::raw_bytes().unwrap();
1004
1005        // desc_content,包括一个(u16长度 + DescContent)内容
1006        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        // 缓存desc_content大小
1025        ctx.cache_desc_content_size(desc_content_usize as u16);
1026
1027        Ok(size)
1028    }
1029
1030    // encode之前,必须已经调用过raw_measure_with_context
1031    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        /*
1038        let size = self.raw_measure_with_context(ctx, purpose).unwrap();
1039        if buf.len() < size {
1040            let message  = format!("[raw_encode] not enough buffer for NamedObjectDesc, obj_type:{}, obj_type_code:{:?}", T::obj_type(), T::obj_type_code());
1041            return Err(BuckyError::new(BuckyErrorCode::OutOfLimit, message));
1042        }
1043        */
1044
1045        // ObjectDesc
1046
1047        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        // OwnderObjectDesc/AreaObjectDesc/AuthorObjectDesc/PublicKeyObjectDesc
1091
1092        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        // 编码version, 8bits
1133        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        // 编码format,8bits
1139        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        // desc_content
1145        // 使用缓存的size,必须之前先调用过measure
1146        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
1161/// NamedObjectDesc<T> 独立编解码,需要包含obj_type+obj_flags信息
1162/// ===
1163/// * [1] ctx 部分包含obj_type, obj_flags 信息(前5bits为0,区别于NamedObject里的ctx.obj_flags)
1164/// * [2] 其余部分为desc本身的编码
1165/// 需要注意Desc部分独立编码,需要在头部编码正确的NamedObjectContext;如果在NamedObject内部整体编码,则由外层保证
1166impl<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    // 外部对Desc编码,尽量使用to_vec编码,会节省一次raw_measure操作
1185    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        // println!("hash_code: size={}, buf={:?}", size, buf);
1260        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
1288/// NamedObjectDesc<T> 的 解码
1289/// ===
1290/// * ctx: NamedObjectContext 从上层 NamedObjectBase 里传入编码的上下文
1291/// * 通过 ctx 获取 Option 字段信息
1292impl<'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        //
1302        // ObjectDesc
1303        //
1304
1305        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        //
1372        // OwnderObjectDesc/AreaObjectDesc/AuthorObjectDesc/PublicKeyObjectDesc
1373        //
1374        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        // 这里尝试读取是否存在ext扩展字段,如果存在那么为了向前兼容要跳过
1440        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            // 向前兼容,不认识的扩展直接跳过
1452            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        // version
1472        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        // format
1483        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        // desc_content
1496        let (desc_content, buf) = {
1497            // 首先解码长度
1498            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            // 使用精确大小的buffer解码
1515            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                // ObjectDesc
1542                obj_type,
1543                dec_id,
1544                ref_objects,
1545                prev,
1546                create_timestamp,
1547                create_time,
1548                expired_time,
1549
1550                // OwnderObjectDesc/AreaObjectDesc/AuthorObjectDesc/PublicKeyObjectDesc
1551                owner,
1552                area,
1553                author,
1554                public_key,
1555
1556                // desc_content
1557                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    // type ObjectType = O::ObjectType
1571    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    // body
1623
1624    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    /// 大卸八块,映射成其他类型,Move语义
1662    /// ===
1663    /// * desc: O::DescType,
1664    /// * body: Option<ObjectMutBody<O::ContentType, O>>
1665    /// * signs: ObjectSigns,
1666    /// * nonce: Option<u128>,
1667    ///
1668    /// 可进一步对body.unwrap().split()
1669    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        // 如果签名时间比较新,那么取签名时间
1700        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        // TODO 计算flags不需要完整的measure
1717        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        // obj_type+obj_flags
1762        size += u32::raw_bytes().unwrap();
1763
1764        // desc
1765        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        // mut body
1771        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        // signs
1780        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        // nonce
1786        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        // obj_type+obj_flags
1804        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        // desc
1810        let buf = self
1811            .desc()
1812            .raw_encode_with_context(buf, ctx, purpose)
1813            .unwrap();
1814
1815        // mut_body
1816        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        // signs
1826        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        // nonce
1832        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
1845// 任何强类型 NamedObject<D> 都可以直接编码
1846impl<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    // 这里对object整体编码做优化,减少一次measure
1873    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
1886// 有了类型信息,可以确定具体的类型,对具体对类型信息解码
1887impl<'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        // obj_type+obj_flags
1895        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        // 只有 TypelessObjectType 类型才不接受检查
1908        //println!("object type:{}, expected:{}", ctx.obj_type(), O::obj_type());
1909        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        // desc
1922        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        // mut_body
1933        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        // signs
1953        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        // nonce
1964        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
1986// BodyContent的需要实现的部分
1987pub trait BodyContent {
1988    // 这里是使用静态函数还是成员函数?是不是也存在故意编码老版本格式的需求?
1989    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/// NamedObject Type 泛型定义
2003/// ===
2004/// 基于 NamedObjectDesc
2005#[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    // desc
2073
2074    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    // 传入None,表示自动取当前时间,传入Some(x),表示设置为具体时间
2125    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    // sub desc
2143
2144    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    // body
2185
2186    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    // signs
2202
2203    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    // nonce
2224    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}