graphannis_core/
serializer.rs1use std::{convert::TryInto, error::Error};
2
3use serde_bytes::ByteBuf;
4
5pub type KeyVec = smallvec::SmallVec<[u8; 32]>;
6
7pub trait KeySerializer {
8 fn create_key(&self) -> KeyVec;
9 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>>
10 where
11 Self: std::marker::Sized;
12}
13
14pub trait FixedSizeKeySerializer: KeySerializer {
15 fn key_size() -> usize;
16}
17
18impl KeySerializer for Vec<u8> {
19 fn create_key(&self) -> KeyVec {
20 KeyVec::from_slice(self)
21 }
22
23 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
24 Ok(Vec::from(key))
25 }
26}
27
28impl KeySerializer for ByteBuf {
29 fn create_key(&self) -> KeyVec {
30 KeyVec::from_slice(self)
31 }
32
33 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
34 Ok(ByteBuf::from(key))
35 }
36}
37
38impl KeySerializer for KeyVec {
39 fn create_key(&self) -> KeyVec {
40 self.clone()
41 }
42
43 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
44 Ok(KeyVec::from(key))
45 }
46}
47
48impl KeySerializer for String {
49 fn create_key(&self) -> KeyVec {
50 KeyVec::from_slice(self.as_bytes())
51 }
52
53 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
54 let v = String::from_utf8_lossy(key);
55 Ok(v.to_string())
56 }
57}
58
59impl KeySerializer for u8 {
60 fn create_key(&self) -> KeyVec {
61 KeyVec::from_slice(&self.to_be_bytes())
62 }
63
64 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
65 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
66 let result = Self::from_be_bytes(as_array);
67 Ok(result)
68 }
69}
70
71impl FixedSizeKeySerializer for u8 {
72 fn key_size() -> usize {
73 std::mem::size_of::<Self>()
74 }
75}
76
77impl KeySerializer for u16 {
78 fn create_key(&self) -> KeyVec {
79 KeyVec::from_slice(&self.to_be_bytes())
80 }
81
82 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
83 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
84 let result = Self::from_be_bytes(as_array);
85 Ok(result)
86 }
87}
88
89impl FixedSizeKeySerializer for u16 {
90 fn key_size() -> usize {
91 std::mem::size_of::<Self>()
92 }
93}
94
95impl KeySerializer for u32 {
96 fn create_key(&self) -> KeyVec {
97 KeyVec::from_slice(&self.to_be_bytes())
98 }
99
100 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
101 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
102 let result = Self::from_be_bytes(as_array);
103 Ok(result)
104 }
105}
106
107impl FixedSizeKeySerializer for u32 {
108 fn key_size() -> usize {
109 std::mem::size_of::<Self>()
110 }
111}
112
113impl KeySerializer for u64 {
114 fn create_key(&self) -> KeyVec {
115 KeyVec::from_slice(&self.to_be_bytes())
116 }
117
118 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
119 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
120 let result = Self::from_be_bytes(as_array);
121 Ok(result)
122 }
123}
124
125impl FixedSizeKeySerializer for u64 {
126 fn key_size() -> usize {
127 std::mem::size_of::<Self>()
128 }
129}
130
131impl KeySerializer for u128 {
132 fn create_key(&self) -> KeyVec {
133 KeyVec::from_slice(&self.to_be_bytes())
134 }
135
136 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
137 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
138 let result = Self::from_be_bytes(as_array);
139 Ok(result)
140 }
141}
142
143impl FixedSizeKeySerializer for u128 {
144 fn key_size() -> usize {
145 std::mem::size_of::<Self>()
146 }
147}
148
149impl KeySerializer for usize {
150 fn create_key(&self) -> KeyVec {
151 KeyVec::from_slice(&self.to_be_bytes())
152 }
153
154 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
155 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
156 let result = Self::from_be_bytes(as_array);
157 Ok(result)
158 }
159}
160
161impl KeySerializer for i8 {
162 fn create_key(&self) -> KeyVec {
163 KeyVec::from_slice(&self.to_be_bytes())
164 }
165
166 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
167 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
168 let result = Self::from_be_bytes(as_array);
169 Ok(result)
170 }
171}
172
173impl FixedSizeKeySerializer for i8 {
174 fn key_size() -> usize {
175 std::mem::size_of::<Self>()
176 }
177}
178
179impl KeySerializer for i16 {
180 fn create_key(&self) -> KeyVec {
181 KeyVec::from_slice(&self.to_be_bytes())
182 }
183
184 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
185 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
186 let result = Self::from_be_bytes(as_array);
187 Ok(result)
188 }
189}
190
191impl FixedSizeKeySerializer for i16 {
192 fn key_size() -> usize {
193 std::mem::size_of::<Self>()
194 }
195}
196
197impl KeySerializer for i32 {
198 fn create_key(&self) -> KeyVec {
199 KeyVec::from_slice(&self.to_be_bytes())
200 }
201
202 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
203 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
204 let result = Self::from_be_bytes(as_array);
205 Ok(result)
206 }
207}
208
209impl FixedSizeKeySerializer for i32 {
210 fn key_size() -> usize {
211 std::mem::size_of::<Self>()
212 }
213}
214
215impl KeySerializer for i64 {
216 fn create_key(&self) -> KeyVec {
217 KeyVec::from_slice(&self.to_be_bytes())
218 }
219
220 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
221 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
222 let result = Self::from_be_bytes(as_array);
223 Ok(result)
224 }
225}
226
227impl FixedSizeKeySerializer for i64 {
228 fn key_size() -> usize {
229 std::mem::size_of::<Self>()
230 }
231}
232
233impl KeySerializer for i128 {
234 fn create_key(&self) -> KeyVec {
235 KeyVec::from_slice(&self.to_be_bytes())
236 }
237
238 fn parse_key(key: &[u8]) -> Result<Self, Box<dyn Error + Send + Sync>> {
239 let as_array = key[..std::mem::size_of::<Self>()].try_into()?;
240 let result = Self::from_be_bytes(as_array);
241 Ok(result)
242 }
243}
244
245impl FixedSizeKeySerializer for i128 {
246 fn key_size() -> usize {
247 std::mem::size_of::<Self>()
248 }
249}