cgp_serde/providers/
bytes.rs1use core::fmt::Display;
2
3use cgp::prelude::*;
4use serde::de::{Error, Visitor};
5
6use crate::components::{
7 ValueDeserializer, ValueDeserializerComponent, ValueSerializer, ValueSerializerComponent,
8};
9
10pub struct SerializeBytes;
11
12#[cgp_impl(SerializeBytes)]
13impl<Value> ValueSerializer<Value>
14where
15 Value: AsRef<[u8]>,
16{
17 fn serialize<S>(&self, value: &Value, serializer: S) -> Result<S::Ok, S::Error>
18 where
19 S: serde::Serializer,
20 {
21 serializer.serialize_bytes(value.as_ref())
22 }
23}
24
25#[cgp_impl(SerializeBytes)]
26impl<'a, Value> ValueDeserializer<'a, Value>
27where
28 Value: From<&'a [u8]>,
29{
30 fn deserialize<D>(&self, deserializer: D) -> Result<Value, D::Error>
31 where
32 D: serde::Deserializer<'a>,
33 {
34 let bytes = deserializer.deserialize_bytes(SerializeBytes)?;
35 Ok(bytes.into())
36 }
37}
38
39#[cgp_impl(new TryDeserializeBytes)]
40impl<'a, Value> ValueDeserializer<'a, Value>
41where
42 Value: TryFrom<&'a [u8], Error: Display>,
43{
44 fn deserialize<D>(&self, deserializer: D) -> Result<Value, D::Error>
45 where
46 D: serde::Deserializer<'a>,
47 {
48 let bytes = deserializer.deserialize_bytes(SerializeBytes)?;
49 let value = bytes.try_into().map_err(D::Error::custom)?;
50
51 Ok(value)
52 }
53}
54
55impl<'a> Visitor<'a> for SerializeBytes {
56 type Value = &'a [u8];
57
58 fn expecting(&self, formatter: &mut alloc::fmt::Formatter) -> alloc::fmt::Result {
59 formatter.write_str("bytes")
60 }
61
62 fn visit_borrowed_bytes<E>(self, bytes: &'a [u8]) -> Result<Self::Value, E>
63 where
64 E: serde::de::Error,
65 {
66 Ok(bytes)
67 }
68}