use std::sync::Arc;
use super::inspection_runtime::InspectionRuntime;
use super::runtime_core::RuntimeCore;
use super::runtime_session::RuntimeSession;
use crate::Redact;
use crate::RedactionCompletion;
use crate::RedactionInspection;
use crate::RedactionInspectionError;
use crate::RedactionPolicy;
use crate::RedactionReasons;
use crate::Sensitivity;
pub(crate) struct InspectionSession {
runtime: InspectionRuntime,
}
impl InspectionSession {
#[must_use]
pub(crate) fn new(policy: Arc<RedactionPolicy>) -> Self {
Self {
runtime: InspectionRuntime::new(policy),
}
}
pub(crate) fn inspect<T>(&mut self, value: &T)
where
T: Redact + ?Sized,
{
let mut writer = crate::domain::RedactionWriter::new_root(self);
value.write_redacted(&mut writer);
let _ = writer.finish_with_completion();
}
pub(crate) fn finish(self) -> Result<RedactionInspection, RedactionInspectionError> {
let (max_sensitivity, summary) = self.runtime.into_parts();
if summary.completion() == RedactionCompletion::Complete && summary.reasons() == RedactionReasons::empty() {
return Ok(RedactionInspection::new(
summary.is_redaction_disabled(),
max_sensitivity,
summary.usage(),
));
}
Err(RedactionInspectionError::new(summary.reasons(), summary.usage()))
}
}
impl RuntimeSession for InspectionSession {
#[inline(always)]
fn runtime(&self) -> &RuntimeCore {
&self.runtime.core
}
#[inline(always)]
fn runtime_mut(&mut self) -> &mut RuntimeCore {
&mut self.runtime.core
}
#[inline(always)]
fn is_inspection(&self) -> bool {
true
}
#[inline(always)]
fn observe_sensitivity(&mut self, sensitivity: Sensitivity) {
self.runtime.observe_sensitivity(sensitivity);
}
}