ligen_utils/visitors/
mod.rs

1//! Generator visitor module.
2
3pub use enumeration_visitor::*;
4pub use function_visitor::*;
5pub use module_visitor::*;
6pub use parameter_visitor::*;
7pub use library_visitor::*;
8pub use structure_visitor::*;
9pub use import_visitor::*;
10
11use crate::prelude::*;
12
13mod library_visitor;
14mod module_visitor;
15mod enumeration_visitor;
16mod structure_visitor;
17mod function_visitor;
18mod parameter_visitor;
19mod import_visitor;
20
21/// Generic visitor type.
22#[derive(Debug, Clone, Shrinkwrap)]
23#[shrinkwrap(mutable)]
24pub struct Visitor<Parent, Current> {
25    /// Visitor's parent.
26    pub parent: Parent,
27    /// Currently visited.
28    #[shrinkwrap(main_field)]
29    pub current: Current
30}
31
32impl<Parent, Current> Visitor<Parent, Current> {
33    /// Creates a new Visitor.
34    pub fn new(parent: Parent, current: Current) -> Self {
35        Self { parent, current }
36    }
37
38    /// Creates a new child.
39    pub fn child<Child>(&self, current: Child) -> Visitor<Visitor<Parent, Current>, Child>
40        where Parent: Clone,
41              Current: Clone
42    {
43        let parent = self.clone();
44        Visitor { parent, current }
45    }
46}