1
2pub mod base64_u8 {
8 use base64::Engine;
9 use serde::{Serialize, Serializer};
10
11 pub fn serialize<S: Serializer>(v: &[u8], s: S) -> Result<S::Ok, S::Error> {
12 let engine = base64::engine::general_purpose::STANDARD_NO_PAD;
13 let base64 = engine.encode(v);
14 String::serialize(&base64, s)
15 }
16}
17
18pub mod base64_vec_u8 {
19 use base64::Engine;
20 use serde::{Serialize, Deserialize};
21 use serde::{Deserializer, Serializer};
22
23 pub fn serialize<S: Serializer>(v: &Vec<u8>, s: S) -> Result<S::Ok, S::Error> {
24 let engine = base64::engine::general_purpose::STANDARD_NO_PAD;
25 let base64 = engine.encode(v);
26 String::serialize(&base64, s)
27 }
28
29 pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<u8>, D::Error> {
30 let base64 = String::deserialize(d)?;
31 let engine = base64::engine::general_purpose::STANDARD_NO_PAD;
32 engine.decode(base64.as_bytes())
33 .map_err(|e| serde::de::Error::custom(e))
34 }
35}
36
37pub mod base64_opt_vec_u8 {
38 use serde::de::Visitor;
39 use serde::{Deserializer, Serializer};
40
41use super::base64_vec_u8;
42
43 pub fn serialize<S: Serializer>(v: &Option<Vec<u8>>, s: S) -> Result<S::Ok, S::Error> {
44 match v {
45 Some(v) => return base64_vec_u8::serialize(v, s),
46 None => return s.serialize_none(),
47 };
48 }
49
50 pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<Vec<u8>>, D::Error> {
51 return d.deserialize_option(OptVisitor {});
52 }
53
54 struct OptVisitor {}
55
56 impl<'de> Visitor<'de> for OptVisitor {
57 type Value = Option<Vec<u8>>;
58
59 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
60 return write!(formatter, "Some(base64-value) or None.");
61 }
62
63 fn visit_none<E>(self) -> Result<Self::Value, E>
64 where
65 E: serde::de::Error, {
66 return Ok(None);
67 }
68
69 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
70 where
71 D: Deserializer<'de>, {
72 let result = base64_vec_u8::deserialize(deserializer)?;
73 return Ok(Some(result));
74 }
75 }
76}