Skip to main content

cgp_serde/providers/
bytes.rs

1use 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}