use std::borrow::Cow;
pub fn redact_credentials(s: &str) -> Cow<'_, str> {
if !s.contains("://") {
return Cow::Borrowed(s);
}
let mut result = String::with_capacity(s.len());
let mut pos = 0;
let mut modified = false;
while pos < s.len() {
match s[pos..].find("://") {
None => {
result.push_str(&s[pos..]);
break;
}
Some(rel) => {
let after_scheme = pos + rel + 3;
result.push_str(&s[pos..after_scheme]);
pos = after_scheme;
let auth_end = s[pos..]
.find(|c: char| c == '/' || c == '?' || c == '#' || c.is_whitespace())
.map(|r| pos + r)
.unwrap_or(s.len());
let authority = &s[pos..auth_end];
if let Some(at_rel) = authority.rfind('@') {
result.push_str("[REDACTED]@");
result.push_str(&authority[at_rel + 1..]);
modified = true;
} else {
result.push_str(authority);
}
pos = auth_end;
}
}
}
if modified {
Cow::Owned(result)
} else {
Cow::Borrowed(s)
}
}