forked from
smokesignal.events/smokesignal
i18n+filtering fork - fluent-templates v2
1use anyhow::Result;
2use base64::{engine::general_purpose, Engine as _};
3use serde::{Deserialize, Serialize};
4use std::borrow::Cow;
5
6use crate::encoding_errors::EncodingError;
7
8pub trait ToBase64 {
9 fn to_base64(&self) -> Result<Cow<str>>;
10}
11
12impl<T: Serialize> ToBase64 for T {
13 fn to_base64(&self) -> Result<Cow<str>> {
14 let json_bytes =
15 serde_json::to_vec(&self).map_err(EncodingError::JsonSerializationFailed)?;
16 let encoded_json_bytes = general_purpose::URL_SAFE_NO_PAD.encode(json_bytes);
17 Ok(Cow::Owned(encoded_json_bytes))
18 }
19}
20
21pub trait FromBase64: Sized {
22 fn from_base64<Input: ?Sized + AsRef<[u8]>>(raw: &Input) -> Result<Self>;
23}
24
25impl<T: for<'de> Deserialize<'de> + Sized> FromBase64 for T {
26 fn from_base64<Input: ?Sized + AsRef<[u8]>>(raw: &Input) -> Result<Self> {
27 let content = general_purpose::URL_SAFE_NO_PAD
28 .decode(raw)
29 .map_err(EncodingError::Base64DecodingFailed)?;
30 serde_json::from_slice(&content)
31 .map_err(|err| EncodingError::JsonDeserializationFailed(err).into())
32 }
33}