1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! Base64 deserialization of Vec<u8>

use std::fmt;

use base64::Engine;

/// Serde visitor for deserializing Base64-encoded values
struct Base64Visitor;

impl<'a> serde::de::Visitor<'a> for Base64Visitor {
    type Value = Vec<u8>;

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        formatter.write_str("base64 image")
    }

    fn visit_str<A>(self, string: &str) -> Result<Self::Value, A>
    where
        A: serde::de::Error,
    {
        base64::engine::general_purpose::STANDARD_NO_PAD
            .decode(string)
            .map_err(|err| serde::de::Error::custom(err.to_string()))
    }
}

/// Decode a base64-encoded value
///
/// # Parameters
///
/// `deserializer`: Serde deserializer
pub fn from_base64<'de, D>(deserializer: D) -> std::result::Result<Vec<u8>, D::Error>
where
    D: serde::Deserializer<'de>,
{
    deserializer.deserialize_str(Base64Visitor {})
}