Skip to main content

base32/
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
11pub fn serialize<S: Serializer>(data: &[u8], serializer: S) -> Result<S::Ok, S::Error> {
12    if serializer.is_human_readable() {
13        serializer.serialize_str(&encode(data, Alphabet::Rfc4648))
14    } else {
15        serializer.serialize_bytes(data)
16    }
17}
18
19pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<u8>, D::Error> {
20    if deserializer.is_human_readable() {
21        deserializer.deserialize_str(Base32Visitor)
22    } else {
23        deserializer.deserialize_bytes(Base32Visitor)
24    }
25}
26
27struct Base32Visitor;
28
29impl<'de> Visitor<'de> for Base32Visitor {
30    type Value = Vec<u8>;
31
32    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
33        f.write_str("a base32 string")
34    }
35
36    fn visit_str<E: de::Error>(self, v: &str) -> Result<Vec<u8>, E> {
37        decode(v.as_bytes(), Alphabet::Rfc4648).map_err(de::Error::custom)
38    }
39
40    fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Vec<u8>, E> {
41        Ok(v.to_vec())
42    }
43}