1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
//! Nodes to represent the internal structure of a router. use super::matcher::Matcher; /// Node structure to represent the internal structure of a router. /// /// A router is simply a `Node` which doesn't have any parent nodes, /// which allows for the recursive structure of the tree. Each /// `Node` can have a value of the generic type, which is the value /// returned when routing occurs. /// /// Every `Node` also has an associated `Matcher` which is used /// to test for compatibility when routing (because not every node /// is applicable on a given segment order). This `Matcher` is /// automatically provided to the `Node` at creation time and is /// calculated by the routing system. /// /// Lastly, a `Node` can have child instances to represent the /// recursive structure of a router. These children are stored in /// a `Vec` as there's currently no logical way to index them into /// a more suitable structure. If a `Node` has no children, the /// containing vector does not require any memory allocation. Any /// memory will be allocated lazily, and should remain minimal in /// most standard cases (as it depends on the allocator in use). pub struct Node<T> { value: Option<T>, matcher: Box<Matcher>, children: Vec<Node<T>>, } impl<T> Node<T> { /// Constructs a new `Node` from a literal. pub(crate) fn new(matcher: Box<Matcher>) -> Self { Self { matcher, value: None, children: Vec::new(), } } /// Registers a child node inside this node. pub(crate) fn add_child(&mut self, child: Node<T>) { self.children.reserve_exact(1); self.children.push(child); } /// Retrieves a reference to the children of this node. pub(crate) fn children(&self) -> &[Node<T>] { &self.children } /// Retrieves a mutable reference to the children of this node. pub(crate) fn children_mut(&mut self) -> &mut [Node<T>] { &mut self.children } /// Retrieves the matching struct for this node. pub(crate) fn matcher(&self) -> &dyn Matcher { &*self.matcher } /// Updates the inner value of this routing pub(crate) fn update<F>(&mut self, f: F) where F: FnOnce(Option<T>) -> T, { let t = f(self.value.take()); self.value.replace(t); } /// Retrieves a potential handler associated with the provided method. pub(crate) fn value(&self) -> Option<&T> { self.value.as_ref() } }