use core::slice::Iter;
use crate::path::{Param, Pattern};
use crate::Router;
pub struct Node {
pub pattern: Pattern,
pub route: Option<usize>,
entries: Vec<usize>,
}
pub struct RouteEntry<'a, T> {
router: &'a mut Router<T>,
key: usize,
}
impl Node {
pub fn new(pattern: Pattern) -> Self {
Self {
pattern,
entries: Vec::new(),
route: None,
}
}
pub fn entries(&self) -> Iter<usize> {
self.entries.iter()
}
pub fn param(&self) -> Option<&Param> {
match &self.pattern {
Pattern::Wildcard(param) | Pattern::Dynamic(param) => Some(param),
_ => None,
}
}
}
impl Node {
fn push(&mut self, key: usize) -> usize {
self.entries.push(key);
key
}
}
impl<'a, T> RouteEntry<'a, T> {
pub fn new(router: &'a mut Router<T>, key: usize) -> Self {
Self { router, key }
}
pub fn push(&mut self, node: Node) -> usize {
let next_node_index = self.router.push(node);
self.router.node_mut(self.key).push(next_node_index);
next_node_index
}
pub fn insert_route(&mut self, route: T) -> usize {
let route_index = self.router.push_route(route);
self.router.node_mut(self.key).route = Some(route_index);
route_index
}
pub fn get_or_insert_route_with<F>(&mut self, f: F) -> usize
where
F: FnOnce() -> T,
{
let route = self.router.node(self.key).route;
route.unwrap_or_else(|| self.insert_route(f()))
}
}