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}