bucky_raw_codec/raw/
raw_codec.rs

1use crate::*;
2
3use std::any::Any;
4use crate::error::CodecResult;
5
6//能静态确定编码后大小
7pub trait RawFixedBytes {
8    fn raw_bytes() -> Option<usize> {
9        None
10    }
11    fn raw_max_bytes() -> Option<usize> {
12        Self::raw_bytes()
13    }
14    fn raw_min_bytes() -> Option<usize> {
15        Self::raw_bytes()
16    }
17}
18
19#[derive(Debug, Clone, Eq, PartialEq)]
20pub enum RawEncodePurpose {
21    // 默认值,为序列化而编码,需要是完整编码
22    Serialize,
23
24    // 为计算hash而编码
25    Hash,
26}
27
28#[derive(Debug, Clone)]
29pub struct RawDecodeOption {
30    pub version: u8,
31    pub format: u8,
32}
33
34impl Default for RawDecodeOption {
35    fn default() -> Self {
36        Self {
37            version: 0,
38            format: OBJECT_CONTENT_CODEC_FORMAT_RAW,
39        }
40    }
41}
42
43//编码
44pub trait RawEncode {
45    fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> CodecResult<usize>;
46    fn raw_encode<'a>(
47        &self,
48        buf: &'a mut [u8],
49        purpose: &Option<RawEncodePurpose>,
50    ) -> CodecResult<&'a mut [u8]>;
51    fn raw_tail_encode<'a>(
52        &self,
53        buf: &'a mut [u8],
54        purpose: &Option<RawEncodePurpose>,
55    ) -> CodecResult<&'a [u8]> {
56        let remain_buf = self.raw_encode(buf, purpose)?;
57        let remain_len = remain_buf.len();
58        Ok(&buf[..(buf.len() - remain_len)])
59    }
60
61    // 直接编码到buffer
62    fn raw_encode_to_buffer(&self) -> CodecResult<Vec<u8>> {
63        let size = self.raw_measure(&None)?;
64        let mut encode_buf = vec![0u8; size];
65
66        let buf = self.raw_encode(&mut encode_buf, &None)?;
67        assert_eq!(buf.len(), 0);
68
69        Ok(encode_buf)
70    }
71
72    // 默认hash编码实现,子类可以覆盖
73    fn raw_hash_encode(&self) -> CodecResult<Vec<u8>> {
74        let size = self.raw_measure(&Some(RawEncodePurpose::Hash))?;
75        let mut buf = vec![0u8; size];
76        let remain_buf = self.raw_encode(&mut buf, &Some(RawEncodePurpose::Hash))?;
77        assert!(remain_buf.len() == 0);
78
79        Ok(buf)
80    }
81}
82
83pub trait RawEncodeWithContext<Context> {
84    fn raw_measure_with_context(
85        &self,
86        _: &mut Context,
87        purpose: &Option<RawEncodePurpose>,
88    ) -> CodecResult<usize>;
89    fn raw_encode_with_context<'a>(
90        &self,
91        buf: &'a mut [u8],
92        _: &mut Context,
93        purpose: &Option<RawEncodePurpose>,
94    ) -> CodecResult<&'a mut [u8]>;
95    fn raw_tail_encode_with_context<'a>(
96        &self,
97        buf: &'a mut [u8],
98        context: &mut Context,
99        purpose: &Option<RawEncodePurpose>,
100    ) -> CodecResult<&'a [u8]> {
101        let remain_buf = self.raw_encode_with_context(buf, context, purpose)?;
102        let remain_len = remain_buf.len();
103        Ok(&buf[..(buf.len() - remain_len)])
104    }
105}
106
107//解码
108pub trait RawDecode<'de>: Sized {
109    // 不带opt的解码,默认一般实现此方法
110    fn raw_decode(buf: &'de [u8]) -> CodecResult<(Self, &'de [u8])>;
111
112    // 带opt的解码,如果想使用版本等高级解码特性,需要实现此方法
113    fn raw_decode_with_option(
114        buf: &'de [u8],
115        _opt: &RawDecodeOption,
116    ) -> CodecResult<(Self, &'de [u8])> {
117        Self::raw_decode(buf)
118    }
119}
120
121pub trait RawDecodeWithContext<'de, Context>: Sized {
122    fn raw_decode_with_context(buf: &'de [u8], _: Context) -> CodecResult<(Self, &'de [u8])>;
123}
124
125pub trait RawMergable: Clone + Any {
126    fn raw_merge_ok(&self, other: &Self) -> bool;
127}
128
129impl<T: RawEncode + Eq + Clone + Any> RawMergable for T {
130    fn raw_merge_ok(&self, other: &Self) -> bool {
131        self.eq(other)
132    }
133}