openapi_context/
base64_format.rs

1// These functions are only used if the API uses base64-encoded properties, so allow them to be
2// dead code.
3#![allow(dead_code)]
4#[cfg(feature = "serdejson")]
5use base64::{decode, encode};
6#[cfg(feature = "serdejson")]
7use serde::de::{Deserialize, Deserializer, Error};
8#[cfg(feature = "serdejson")]
9use serde::ser::{Serialize, Serializer};
10use std::ops::{Deref, DerefMut};
11
12#[derive(Debug, Clone, PartialEq, PartialOrd)]
13/// Base64-encoded byte array
14pub struct ByteArray(pub Vec<u8>);
15
16#[cfg(feature = "serdejson")]
17impl Serialize for ByteArray {
18    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
19    where
20        S: Serializer,
21    {
22        serializer.serialize_str(&encode(&self.0))
23    }
24}
25
26#[cfg(feature = "serdejson")]
27impl<'de> Deserialize<'de> for ByteArray {
28    fn deserialize<D>(deserializer: D) -> Result<ByteArray, D::Error>
29    where
30        D: Deserializer<'de>,
31    {
32        let s = String::deserialize(deserializer)?;
33        match decode(&s) {
34            Ok(bin) => Ok(ByteArray(bin)),
35            _ => Err(D::Error::custom("invalid base64")),
36        }
37    }
38}
39
40impl Deref for ByteArray {
41    type Target = Vec<u8>;
42    fn deref(&self) -> &Vec<u8> {
43        &self.0
44    }
45}
46
47impl DerefMut for ByteArray {
48    fn deref_mut(&mut self) -> &mut Vec<u8> {
49        &mut self.0
50    }
51}