use crate::errors::{CrabError, CrabResult};
pub fn base64_encode(data: &[u8]) -> String {
use base64::Engine;
base64::engine::general_purpose::STANDARD.encode(data)
}
pub fn base64_decode(data: &str) -> CrabResult<Vec<u8>> {
use base64::Engine;
base64::engine::general_purpose::STANDARD
.decode(data)
.map_err(|e| CrabError::encoding_error(format!("Base64 decode failed: {}", e)))
}
pub fn base64_url_encode(data: &[u8]) -> String {
use base64::Engine;
base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(data)
}
pub fn base64_url_decode(data: &str) -> CrabResult<Vec<u8>> {
use base64::Engine;
base64::engine::general_purpose::URL_SAFE_NO_PAD
.decode(data)
.map_err(|e| CrabError::encoding_error(format!("Base64 URL decode failed: {}", e)))
}
pub fn hex_encode(data: &[u8]) -> String {
hex::encode(data)
}
pub fn hex_decode(data: &str) -> CrabResult<Vec<u8>> {
hex::decode(data).map_err(|e| CrabError::encoding_error(format!("Hex decode failed: {}", e)))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_base64_roundtrip() {
let data = b"Hello, World!";
let encoded = base64_encode(data);
let decoded = base64_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_base64_url_roundtrip() {
let data = b"Hello, World! 123";
let encoded = base64_url_encode(data);
assert!(!encoded.contains('='));
let decoded = base64_url_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_hex_roundtrip() {
let data = b"\x00\x01\x02\xfe\xff";
let encoded = hex_encode(data);
assert_eq!(encoded, "000102feff");
let decoded = hex_decode(&encoded).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_base64_invalid() {
let result = base64_decode("not valid base64!!!");
assert!(result.is_err());
}
#[test]
fn test_hex_invalid() {
let result = hex_decode("not valid hex");
assert!(result.is_err());
}
}