use base64::{
engine::{general_purpose, DecodePaddingMode},
Engine as _,
};
pub fn base64_encode(input: &str) -> String {
general_purpose::STANDARD.encode(input)
}
fn base64_decode(input: &str, accept_urlsafe: bool) -> Option<String> {
let purpose_config = general_purpose::GeneralPurposeConfig::new()
.with_decode_padding_mode(DecodePaddingMode::Indifferent);
let engine = general_purpose::GeneralPurpose::new(
if accept_urlsafe {
&base64::alphabet::URL_SAFE
} else {
&base64::alphabet::STANDARD
},
purpose_config,
);
match engine.decode(input) {
Ok(decoded) => Some(String::from_utf8_lossy(&decoded).to_string()),
Err(e) => {
log::warn!("Failed to decode base64: {}", e);
None
} }
}
pub fn url_safe_base64_reverse(input: &str) -> String {
input.replace('-', "+").replace('_', "/")
}
pub fn url_safe_base64_apply(input: &str) -> String {
input.replace('+', "-").replace('/', "_").replace('=', "") }
pub fn url_safe_base64_decode(input: &str) -> String {
match base64_decode(&url_safe_base64_reverse(input), false) {
Some(decoded) => decoded,
None => input.to_string(),
}
}
pub fn url_safe_base64_encode(input: &str) -> String {
url_safe_base64_apply(&base64_encode(input))
}