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}