use once_cell::sync::Lazy;
use regex::Regex;
static BASE64_PATTERN: Lazy<Regex> = Lazy::new(|| {
Regex::new(r"data:[^;]+;base64,[A-Za-z0-9+/]*={0,2}|[A-Za-z0-9+/]{200,}={0,2}").unwrap()
});
pub fn truncate_base64(content: &str) -> String {
BASE64_PATTERN
.replace_all(content, |caps: ®ex::Captures<'_>| {
let matched = caps.get(0).map_or("", |m| m.as_str());
if matched.starts_with("data:") {
if let Some(comma_idx) = matched.find(',') {
let prefix = &matched[..comma_idx + 1];
format!("{}[BASE64_TRUNCATED]", prefix)
} else {
"[BASE64_TRUNCATED]".to_owned()
}
}
else if matched.len() > 100 {
if matched.contains('+') || matched.contains('/') {
format!("{}...[BASE64_TRUNCATED]", &matched[..50])
} else {
matched.to_owned()
}
}
else {
matched.to_owned()
}
})
.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_truncate_base64_data_uri() {
let input = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==";
let result = truncate_base64(input);
assert!(result.contains("data:image/png;base64,"));
assert!(result.contains("[BASE64_TRUNCATED]"));
}
#[test]
fn test_truncate_base64_long_string() {
let input = "A".repeat(150) + "+" + &"B".repeat(100) + "/";
let result = truncate_base64(&input);
assert!(result.contains("[BASE64_TRUNCATED]") || result.len() == input.len());
}
#[test]
fn test_truncate_base64_no_truncation_short() {
let input = "SGVsbG8gV29ybGQ="; let result = truncate_base64(input);
assert_eq!(result, input);
}
#[test]
fn test_truncate_base64_preserves_non_base64() {
let input = "This is regular text without base64";
let result = truncate_base64(input);
assert_eq!(result, input);
}
#[test]
fn test_truncate_base64_multiple_data_uris() {
let input = "data:image/png;base64,ABC123 and data:image/jpeg;base64,XYZ789";
let result = truncate_base64(input);
assert!(result.contains("data:image/png;base64,[BASE64_TRUNCATED]"));
assert!(result.contains("data:image/jpeg;base64,[BASE64_TRUNCATED]"));
}
#[test]
fn test_truncate_base64_mixed_content() {
let input = "Normal text data:image/png;base64,iVBORw0KGgoAAAA more text";
let result = truncate_base64(input);
assert!(result.contains("Normal text"));
assert!(result.contains("[BASE64_TRUNCATED]"));
assert!(result.contains("more text"));
}
#[test]
fn test_truncate_base64_empty_string() {
let input = "";
let result = truncate_base64(input);
assert_eq!(result, "");
}
#[test]
fn test_truncate_base64_data_uri_without_comma() {
let input = "data:image/png;base64";
let result = truncate_base64(input);
assert_eq!(result, input);
}
#[test]
fn test_truncate_base64_long_without_special_chars() {
let input = "A".repeat(250);
let result = truncate_base64(&input);
assert_eq!(result, input);
}
#[test]
fn test_truncate_base64_exactly_200_chars() {
let input = "A".repeat(199) + "+";
let result = truncate_base64(&input);
assert!(result.contains("[BASE64_TRUNCATED]"));
}
}