cyfs_base/objects/
object_impl.rs

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