libsubconverter/utils/
base64.rs1use base64::{
2 engine::{general_purpose, DecodePaddingMode},
3 Engine as _,
4};
5
6pub fn base64_encode(input: &str) -> String {
8 general_purpose::STANDARD.encode(input)
9}
10
11fn base64_decode(input: &str, accept_urlsafe: bool) -> Option<String> {
20 let purpose_config = general_purpose::GeneralPurposeConfig::new()
21 .with_decode_padding_mode(DecodePaddingMode::Indifferent);
22 let engine = general_purpose::GeneralPurpose::new(
23 if accept_urlsafe {
24 &base64::alphabet::URL_SAFE
25 } else {
26 &base64::alphabet::STANDARD
27 },
28 purpose_config,
29 );
30 match engine.decode(input) {
31 Ok(decoded) => Some(String::from_utf8_lossy(&decoded).to_string()),
32 Err(e) => {
33 log::warn!("Failed to decode base64: {}", e);
34 None
35 } }
37}
38
39pub fn url_safe_base64_reverse(input: &str) -> String {
41 input.replace('-', "+").replace('_', "/")
42}
43
44pub fn url_safe_base64_apply(input: &str) -> String {
46 input.replace('+', "-").replace('/', "_").replace('=', "") }
48
49pub fn url_safe_base64_decode(input: &str) -> String {
51 match base64_decode(&url_safe_base64_reverse(input), false) {
52 Some(decoded) => decoded,
53 None => input.to_string(),
54 }
55}
56
57pub fn url_safe_base64_encode(input: &str) -> String {
59 url_safe_base64_apply(&base64_encode(input))
60}