use std::borrow::Cow;
use super::DiagnosticRedactionBatchOutput;
use super::DiagnosticRedactionHandle;
use super::RedactedText;
use super::RedactionSummary;
use crate::output::log_escape::escape_log_control_characters;
pub struct DiagnosticRedactionOutput {
output: DiagnosticRedactionBatchOutput,
marker: RedactedText,
}
impl DiagnosticRedactionOutput {
#[must_use]
#[inline]
pub(crate) fn new(output: DiagnosticRedactionBatchOutput, marker: &str) -> Self {
let marker = escape_log_control_characters(Cow::Borrowed(marker));
Self {
output,
marker: RedactedText::from_escaped(marker.into_owned()),
}
}
#[must_use]
#[inline]
pub fn text(&self, handle: DiagnosticRedactionHandle) -> &RedactedText {
self.output
.resolve(handle)
.ok()
.and_then(|output| output.complete_text().ok())
.unwrap_or(&self.marker)
}
#[must_use]
#[inline(always)]
pub const fn summary(&self) -> &RedactionSummary {
self.output.summary()
}
}
#[cfg(test)]
mod tests {
use std::ptr;
use super::DiagnosticRedactionHandle;
use crate::Redactor;
#[test]
fn test_text_reuses_escaped_marker_for_missing_same_batch_item() {
let mut batch = Redactor::standard().diagnostic_batch();
let valid = batch.redact_field("name", "Ada");
let missing = DiagnosticRedactionHandle {
batch_id: valid.batch_id,
item_index: usize::MAX,
};
let diagnostics = batch.finish_with_marker("<redaction\nincomplete>");
let first = diagnostics.text(missing);
let second = diagnostics.text(missing);
assert_eq!(first.as_str(), "<redaction\\nincomplete>");
assert!(ptr::eq(first, second));
}
}