cgp_serde_extra/providers/
base64.rs1use alloc::string::String;
2use alloc::vec::Vec;
3
4use base64::prelude::*;
5use cgp::prelude::*;
6use cgp_serde::components::{
7 CanDeserializeValue, CanSerializeValue, ValueDeserializer, ValueDeserializerComponent,
8 ValueSerializer, ValueSerializerComponent,
9};
10use serde::de::Error;
11
12pub struct SerializeBase64;
13
14#[cgp_impl(SerializeBase64)]
15#[uses(CanSerializeValue<String>)]
16impl<Value> ValueSerializer<Value>
17where
18 Value: AsRef<[u8]>,
19{
20 fn serialize<S>(&self, value: &Value, serializer: S) -> Result<S::Ok, S::Error>
21 where
22 S: serde::Serializer,
23 {
24 let str_value = BASE64_STANDARD.encode(value);
25 self.serialize(&str_value, serializer)
26 }
27}
28
29#[cgp_impl(SerializeBase64)]
30#[uses(CanDeserializeValue<'de, String>)]
31impl<'de> ValueDeserializer<'de, Vec<u8>> {
32 fn deserialize<D>(&self, deserializer: D) -> Result<Vec<u8>, D::Error>
33 where
34 D: serde::Deserializer<'de>,
35 {
36 let str_value = self.deserialize(deserializer)?;
37 BASE64_STANDARD.decode(str_value).map_err(Error::custom)
38 }
39}