use crate::{
traits::Visitable,
types::Timestamp,
visitor::{
PathSegment, VisitorError, VisitorMutAdapter, perform_visit_mut, sanitize::SanitizeVisitor,
},
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SanitizeWriteMode {
Insert,
Replace,
Update,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct SanitizeWriteContext {
mode: SanitizeWriteMode,
now: Timestamp,
}
impl SanitizeWriteContext {
#[must_use]
pub const fn new(mode: SanitizeWriteMode, now: Timestamp) -> Self {
Self { mode, now }
}
#[must_use]
pub const fn mode(self) -> SanitizeWriteMode {
self.mode
}
#[must_use]
pub const fn now(self) -> Timestamp {
self.now
}
}
pub fn sanitize(node: &mut dyn Visitable) -> Result<(), VisitorError> {
sanitize_with_context(node, None)
}
pub fn sanitize_with_context(
node: &mut dyn Visitable,
write_context: Option<SanitizeWriteContext>,
) -> Result<(), VisitorError> {
let visitor = SanitizeVisitor::new();
let mut adapter = VisitorMutAdapter::with_sanitize_write_context(visitor, write_context);
perform_visit_mut(&mut adapter, node, PathSegment::Empty);
adapter.result().map_err(VisitorError::from)
}