bucky_raw_codec/raw/
raw_codec.rs1use crate::*;
2
3use std::any::Any;
4use crate::error::CodecResult;
5
6pub 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 Serialize,
23
24 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
43pub 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 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 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
107pub trait RawDecode<'de>: Sized {
109 fn raw_decode(buf: &'de [u8]) -> CodecResult<(Self, &'de [u8])>;
111
112 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}