pub use deps_core_macros::RedactingDebug;
#[doc(hidden)]
#[must_use]
pub fn __redact_url_field(value: &(impl AsRef<str> + ?Sized)) -> String {
crate::redact::url_for_tracing(value.as_ref())
}
#[doc(hidden)]
#[must_use]
pub fn __redact_key_field(value: &(impl AsRef<str> + ?Sized)) -> std::borrow::Cow<'_, str> {
crate::redact::redact_declaration_key(value.as_ref())
}
#[cfg(test)]
mod tests {
use super::RedactingDebug;
#[derive(RedactingDebug)]
#[expect(
dead_code,
reason = "fields are only read through the derived Debug impl, which rustc's \
dead-code analysis deliberately does not count as a read"
)]
struct Probe {
#[redact(url)]
index_url: String,
#[redact(key)]
declaration_key: String,
#[raw]
retries: u8,
}
#[test]
fn redact_url_field_masks_userinfo_but_keeps_host() {
let probe = Probe {
index_url: "https://user:hunter2@registry.example/simple?token=abc".to_string(),
declaration_key: "source:https://user:hunter2@10.0.0.1/index".to_string(),
retries: 3,
};
let rendered = format!("{probe:?}");
assert!(
rendered.contains("***@registry.example/simple"),
"expected redacted host to survive in: {rendered}"
);
assert!(
!rendered.contains("hunter2"),
"credential leaked into: {rendered}"
);
assert!(
!rendered.contains("token=abc"),
"query string leaked into: {rendered}"
);
assert!(
rendered.contains("***@10.0.0.1/index"),
"expected redacted key to survive in: {rendered}"
);
assert!(
rendered.contains("retries: 3"),
"expected #[raw] field unredacted in: {rendered}"
);
}
#[test]
fn redact_key_field_returns_borrowed_cow_for_non_credential_key() {
let key = String::from("source:Blocked");
assert!(matches!(
super::__redact_key_field(&key),
std::borrow::Cow::Borrowed(_)
));
}
#[test]
fn redact_key_field_leaves_non_credential_key_unredacted_in_debug_output() {
let probe = Probe {
index_url: "https://registry.example/simple".to_string(),
declaration_key: "source:Blocked".to_string(),
retries: 3,
};
let rendered = format!("{probe:?}");
assert!(
rendered.contains(r#"declaration_key: "source:Blocked""#),
"expected non-credential key to pass through unredacted in: {rendered}"
);
assert!(
!rendered.contains("***"),
"non-credential key should not be redacted: {rendered}"
);
}
}