i18n+filtering fork - fluent-templates v2
at main 1.1 kB view raw
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}