Skip to main content

base64/
serde.rs

1use alloc::vec::Vec;
2use core::fmt;
3
4use serde::{
5    Deserializer, Serializer,
6    de::{self, Visitor},
7};
8
9use crate::{Alphabet, decode, encode};
10
11#[cfg_attr(
12    all(feature = "alloc", feature = "serde"),
13    doc = r##"
14# Example
15
16```
17use serde::{Serialize, Deserialize};
18
19#[derive(Serialize, Deserialize)]
20struct Foo {
21    #[serde(with = "base64")]
22    bar: Vec<u8>,
23}
24```
25"##
26)]
27
28pub fn serialize<S: Serializer>(data: &[u8], serializer: S) -> Result<S::Ok, S::Error> {
29    if serializer.is_human_readable() {
30        serializer.serialize_str(&encode(data, Alphabet::Standard))
31    } else {
32        serializer.serialize_bytes(data)
33    }
34}
35
36pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<u8>, D::Error> {
37    if deserializer.is_human_readable() {
38        deserializer.deserialize_str(Base64Visitor)
39    } else {
40        deserializer.deserialize_bytes(Base64Visitor)
41    }
42}
43
44struct Base64Visitor;
45
46impl<'de> Visitor<'de> for Base64Visitor {
47    type Value = Vec<u8>;
48
49    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
50        f.write_str("a base64 string")
51    }
52
53    fn visit_str<E: de::Error>(self, v: &str) -> Result<Vec<u8>, E> {
54        decode(v.as_bytes(), Alphabet::Standard).map_err(de::Error::custom)
55    }
56
57    fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Vec<u8>, E> {
58        Ok(v.to_vec())
59    }
60}