Skip to main content

rustack_kms_model/
blob.rs

1//! Base64 serde helpers for binary blob fields.
2//!
3//! AWS KMS transmits binary data (ciphertext, plaintext, signatures, etc.)
4//! as base64-encoded strings in JSON. This module provides custom serde
5//! serializers/deserializers for `bytes::Bytes` that handle the base64 encoding.
6
7use base64::{Engine, engine::general_purpose::STANDARD};
8use serde::{Deserialize, Deserializer, Serialize, Serializer};
9
10/// Serialize `bytes::Bytes` as a base64 string.
11pub fn serialize<S: Serializer>(bytes: &bytes::Bytes, s: S) -> Result<S::Ok, S::Error> {
12    STANDARD.encode(bytes.as_ref()).serialize(s)
13}
14
15/// Deserialize a base64 string into `bytes::Bytes`.
16pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<bytes::Bytes, D::Error> {
17    let s = String::deserialize(d)?;
18    STANDARD
19        .decode(&s)
20        .map(bytes::Bytes::from)
21        .map_err(serde::de::Error::custom)
22}
23
24/// Serde helpers for `Option<bytes::Bytes>`.
25pub mod option {
26    use super::{Deserialize, Deserializer, Engine, STANDARD, Serialize, Serializer};
27
28    /// Serialize `Option<bytes::Bytes>` as a base64 string or null.
29    pub fn serialize<S: Serializer>(bytes: &Option<bytes::Bytes>, s: S) -> Result<S::Ok, S::Error> {
30        match bytes {
31            Some(b) => STANDARD.encode(b.as_ref()).serialize(s),
32            None => s.serialize_none(),
33        }
34    }
35
36    /// Deserialize an optional base64 string into `Option<bytes::Bytes>`.
37    pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<bytes::Bytes>, D::Error> {
38        let opt: Option<String> = Option::deserialize(d)?;
39        match opt {
40            Some(s) => STANDARD
41                .decode(&s)
42                .map(|v| Some(bytes::Bytes::from(v)))
43                .map_err(serde::de::Error::custom),
44            None => Ok(None),
45        }
46    }
47}