1use std::collections::BTreeMap;
2
3use serde::{ser::Impossible, Serialize, Serializer};
4
5use buffers::ByteBufOwned;
6
7#[derive(Debug)]
8pub enum SerErrorKind {
9 Other(anyhow::Error),
10}
11
12impl std::fmt::Display for SerErrorKind {
13 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14 match self {
15 SerErrorKind::Other(e) => write!(f, "{e}"),
16 }
17 }
18}
19
20#[derive(Debug)]
21pub struct SerError {
22 kind: SerErrorKind,
23}
24
25impl SerError {
26 fn custom_with_ser<T: std::fmt::Display, W: std::io::Write>(
27 msg: T,
28 _ser: &BencodeSerializer<W>,
29 ) -> Self {
30 serde::ser::Error::custom(msg)
31 }
32 fn from_err_with_ser<E: std::error::Error + Send + Sync + 'static, W: std::io::Write>(
33 err: E,
34 _ser: &BencodeSerializer<W>,
35 ) -> Self {
36 Self {
37 kind: SerErrorKind::Other(err.into()),
38 }
39 }
40}
41
42impl serde::ser::Error for SerError {
43 fn custom<T>(msg: T) -> Self
44 where
45 T: std::fmt::Display,
46 {
47 Self {
48 kind: SerErrorKind::Other(anyhow::anyhow!("{}", msg)),
49 }
50 }
51}
52
53impl std::error::Error for SerError {}
54
55impl std::fmt::Display for SerError {
56 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57 write!(f, "{}", self.kind)
58 }
59}
60
61struct BencodeSerializer<W: std::io::Write> {
62 writer: W,
63 hack_no_bytestring_prefix: bool,
64}
65
66impl<W: std::io::Write> BencodeSerializer<W> {
67 pub fn new(writer: W) -> Self {
68 Self {
69 writer,
70 hack_no_bytestring_prefix: false,
71 }
72 }
73 fn write_raw(&mut self, buf: &[u8]) -> Result<(), SerError> {
74 self.writer
75 .write_all(buf)
76 .map_err(|e| SerError::from_err_with_ser(e, self))
77 }
78 fn write_fmt(&mut self, fmt: core::fmt::Arguments<'_>) -> Result<(), SerError> {
79 self.writer
80 .write_fmt(fmt)
81 .map_err(|e| SerError::from_err_with_ser(e, self))
82 }
83 fn write_byte(&mut self, byte: u8) -> Result<(), SerError> {
84 self.write_raw(&[byte])
85 }
86 fn write_number<N: std::fmt::Display>(&mut self, number: N) -> Result<(), SerError> {
87 self.write_fmt(format_args!("i{number}e"))
88 }
89 fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), SerError> {
90 if !self.hack_no_bytestring_prefix {
91 self.write_fmt(format_args!("{}:", bytes.len()))?;
92 }
93 self.write_raw(bytes)
94 }
95}
96
97struct SerializeSeq<'ser, W: std::io::Write> {
98 ser: &'ser mut BencodeSerializer<W>,
99}
100impl<W: std::io::Write> serde::ser::SerializeSeq for SerializeSeq<'_, W> {
101 type Ok = ();
102
103 type Error = SerError;
104
105 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
106 where
107 T: ?Sized + serde::Serialize,
108 {
109 value.serialize(&mut *self.ser)
110 }
111
112 fn end(self) -> Result<Self::Ok, Self::Error> {
113 self.ser.write_byte(b'e')
114 }
115}
116
117struct SerializeTuple<'ser, W: std::io::Write> {
118 ser: &'ser mut BencodeSerializer<W>,
119}
120impl<W: std::io::Write> serde::ser::SerializeTuple for SerializeTuple<'_, W> {
121 type Ok = ();
122
123 type Error = SerError;
124
125 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
126 where
127 T: ?Sized + serde::Serialize,
128 {
129 value.serialize(&mut *self.ser)
130 }
131
132 fn end(self) -> Result<Self::Ok, Self::Error> {
133 self.ser.write_byte(b'e')
134 }
135}
136
137struct SerializeMap<'ser, W: std::io::Write> {
138 ser: &'ser mut BencodeSerializer<W>,
139 tmp: BTreeMap<ByteBufOwned, ByteBufOwned>,
140 last_key: Option<ByteBufOwned>,
141}
142impl<W: std::io::Write> serde::ser::SerializeMap for SerializeMap<'_, W> {
143 type Ok = ();
144
145 type Error = SerError;
146
147 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
148 where
149 T: ?Sized + serde::Serialize,
150 {
151 let mut buf = Vec::new();
152 let mut ser = BencodeSerializer::new(&mut buf);
153 ser.hack_no_bytestring_prefix = true;
154 key.serialize(&mut ser)?;
155 self.last_key.replace(ByteBufOwned::from(buf));
156 Ok(())
157 }
159
160 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
161 where
162 T: ?Sized + serde::Serialize,
163 {
164 let mut buf = Vec::new();
165 let mut ser = BencodeSerializer::new(&mut buf);
166 value.serialize(&mut ser)?;
167 self.tmp
168 .insert(self.last_key.take().unwrap(), ByteBufOwned::from(buf));
169 Ok(())
170 }
171
172 fn end(self) -> Result<Self::Ok, Self::Error> {
173 for (key, value) in self.tmp {
174 self.ser.write_bytes(&key)?;
175 self.ser.write_raw(&value)?;
176 }
177 self.ser.write_byte(b'e')
178 }
179}
180
181struct SerializeStruct<'ser, W: std::io::Write> {
182 ser: &'ser mut BencodeSerializer<W>,
183 tmp: BTreeMap<&'static str, ByteBufOwned>,
184}
185impl<W: std::io::Write> serde::ser::SerializeStruct for SerializeStruct<'_, W> {
186 type Ok = ();
187
188 type Error = SerError;
189
190 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
191 where
192 T: ?Sized + serde::Serialize,
193 {
194 let mut buf = Vec::new();
195 let mut ser = BencodeSerializer::new(&mut buf);
196 value.serialize(&mut ser)?;
197 self.tmp.insert(key, ByteBufOwned::from(buf));
198 Ok(())
199 }
200
201 fn end(self) -> Result<Self::Ok, Self::Error> {
202 for (key, value) in self.tmp {
203 self.ser.write_bytes(key.as_bytes())?;
204 self.ser.write_raw(&value)?;
205 }
206 self.ser.write_byte(b'e')
207 }
208}
209
210impl<'ser, W: std::io::Write> Serializer for &'ser mut BencodeSerializer<W> {
211 type Ok = ();
212 type Error = SerError;
213 type SerializeSeq = SerializeSeq<'ser, W>;
214 type SerializeTuple = SerializeTuple<'ser, W>;
215 type SerializeTupleStruct = Impossible<(), SerError>;
216 type SerializeTupleVariant = Impossible<(), SerError>;
217 type SerializeMap = SerializeMap<'ser, W>;
218 type SerializeStruct = SerializeStruct<'ser, W>;
219 type SerializeStructVariant = Impossible<(), SerError>;
220
221 fn serialize_bool(self, value: bool) -> Result<Self::Ok, Self::Error> {
222 self.write_number(if value { 1 } else { 0 })
223 }
224
225 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
226 self.write_number(v)
227 }
228
229 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
230 self.write_number(v)
231 }
232
233 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
234 self.write_number(v)
235 }
236
237 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
238 self.write_number(v)
239 }
240
241 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
242 self.write_number(v)
243 }
244
245 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
246 self.write_number(v)
247 }
248
249 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
250 self.write_number(v)
251 }
252
253 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
254 self.write_number(v)
255 }
256
257 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
258 Err(SerError::custom_with_ser(
259 "bencode doesn't support f32",
260 self,
261 ))
262 }
263
264 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
265 Err(SerError::custom_with_ser(
266 "bencode doesn't support f32",
267 self,
268 ))
269 }
270
271 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
272 Err(SerError::custom_with_ser(
273 "bencode doesn't support chars",
274 self,
275 ))
276 }
277
278 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
279 self.write_bytes(v.as_bytes())
280 }
281
282 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
283 self.write_bytes(v)
284 }
285
286 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
287 Err(SerError::custom_with_ser(
288 "bencode doesn't support None",
289 self,
290 ))
291 }
292
293 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
294 where
295 T: ?Sized + serde::Serialize,
296 {
297 value.serialize(self)
298 }
299
300 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
301 Err(SerError::custom_with_ser(
302 "bencode doesn't support Rust unit ()",
303 self,
304 ))
305 }
306
307 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
308 Err(SerError::custom_with_ser(
309 "bencode doesn't support unit structs",
310 self,
311 ))
312 }
313
314 fn serialize_unit_variant(
315 self,
316 _name: &'static str,
317 _variant_index: u32,
318 _variant: &'static str,
319 ) -> Result<Self::Ok, Self::Error> {
320 Err(SerError::custom_with_ser(
321 "bencode doesn't support unit variants",
322 self,
323 ))
324 }
325
326 fn serialize_newtype_struct<T>(
327 self,
328 name: &'static str,
329 value: &T,
330 ) -> Result<Self::Ok, Self::Error>
331 where
332 T: ?Sized + serde::Serialize,
333 {
334 if name == crate::raw_value::TAG {
335 self.hack_no_bytestring_prefix = true;
336 value.serialize(&mut *self)?;
337 self.hack_no_bytestring_prefix = false;
338 return Ok(());
339 }
340 Err(SerError::custom_with_ser(
341 "bencode doesn't support newtype structs",
342 self,
343 ))
344 }
345
346 fn serialize_newtype_variant<T>(
347 self,
348 _name: &'static str,
349 _variant_index: u32,
350 _variant: &'static str,
351 _value: &T,
352 ) -> Result<Self::Ok, Self::Error>
353 where
354 T: ?Sized + serde::Serialize,
355 {
356 Err(SerError::custom_with_ser(
357 "bencode doesn't support newtype variants",
358 self,
359 ))
360 }
361
362 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
363 self.write_byte(b'l')?;
364 Ok(SerializeSeq { ser: self })
365 }
366
367 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
368 Err(SerError::custom_with_ser(
369 "bencode doesn't support tuples",
370 self,
371 ))
372 }
373
374 fn serialize_tuple_struct(
375 self,
376 _name: &'static str,
377 _len: usize,
378 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
379 Err(SerError::custom_with_ser(
380 "bencode doesn't support tuple structs",
381 self,
382 ))
383 }
384
385 fn serialize_tuple_variant(
386 self,
387 _name: &'static str,
388 _variant_index: u32,
389 _variant: &'static str,
390 _len: usize,
391 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
392 Err(SerError::custom_with_ser(
393 "bencode doesn't support tuple variants",
394 self,
395 ))
396 }
397
398 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
399 self.write_byte(b'd')?;
400 Ok(SerializeMap {
401 ser: self,
402 tmp: Default::default(),
403 last_key: None,
404 })
405 }
406
407 fn serialize_struct(
408 self,
409 _name: &'static str,
410 _len: usize,
411 ) -> Result<Self::SerializeStruct, Self::Error> {
412 self.write_byte(b'd')?;
413 Ok(SerializeStruct {
414 ser: self,
415 tmp: Default::default(),
416 })
417 }
418
419 fn serialize_struct_variant(
420 self,
421 _name: &'static str,
422 _variant_index: u32,
423 _variant: &'static str,
424 _len: usize,
425 ) -> Result<Self::SerializeStructVariant, Self::Error> {
426 Err(SerError::custom_with_ser(
427 "bencode doesn't support struct variants",
428 self,
429 ))
430 }
431}
432
433pub fn bencode_serialize_to_writer<T: Serialize, W: std::io::Write>(
434 value: T,
435 writer: &mut W,
436) -> Result<(), SerError> {
437 let mut serializer = BencodeSerializer::new(writer);
438 value.serialize(&mut serializer)?;
439 Ok(())
440}