icydb_core/visitor/
sanitize.rs

1use crate::{
2    traits::Visitable,
3    visitor::{
4        PathSegment, VisitorContext, VisitorIssues, VisitorMut, VisitorMutAdapter,
5        perform_visit_mut,
6    },
7};
8
9///
10/// sanitize
11/// Run the sanitizer visitor over a mutable visitable tree.
12///
13/// Sanitization is total and non-failing. Any issues discovered during
14/// sanitization are reported via the returned `VisitorIssues`.
15///
16pub(crate) fn sanitize(node: &mut dyn Visitable) -> Result<(), VisitorIssues> {
17    let visitor = SanitizeVisitor::new();
18    let mut adapter = VisitorMutAdapter::new(visitor);
19
20    perform_visit_mut(&mut adapter, node, PathSegment::Empty);
21
22    adapter.result()
23}
24
25///
26/// SanitizeVisitor
27/// Walks a tree and applies sanitization at each node.
28///
29
30#[derive(Debug, Default)]
31pub struct SanitizeVisitor;
32
33impl SanitizeVisitor {
34    #[must_use]
35    pub const fn new() -> Self {
36        Self
37    }
38}
39
40impl VisitorMut for SanitizeVisitor {
41    fn enter_mut(&mut self, node: &mut dyn Visitable, ctx: &mut dyn VisitorContext) {
42        node.sanitize_self(ctx);
43        node.sanitize_custom(ctx);
44    }
45
46    fn exit_mut(&mut self, _: &mut dyn Visitable, _: &mut dyn VisitorContext) {}
47}