use crate::types::MethodData;
use ahash::AHashMap;
use indexmap::IndexMap;
use parking_lot::RwLock;
#[derive(Debug, Clone)]
pub struct Node<T> {
pub methods: AHashMap<String, Vec<MethodData<T>>>,
pub static_children: AHashMap<String, Box<Node<T>>>,
pub param_child: Option<Box<Node<T>>>,
pub wildcard_child: Option<Box<Node<T>>>,
}
impl<T> Default for Node<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> Node<T> {
pub fn new() -> Self {
Self {
methods: AHashMap::default(),
static_children: AHashMap::default(),
param_child: None,
wildcard_child: None,
}
}
pub fn is_empty_recursive(&self) -> bool {
self.methods.is_empty()
&& self.static_children.is_empty()
&& self.param_child.is_none()
&& self.wildcard_child.is_none()
}
}
pub type StaticPathMethods<T> = AHashMap<String, Vec<MethodData<T>>>;
#[derive(Debug)]
pub struct Router<T> {
pub root: RwLock<Box<Node<T>>>,
pub static_map: RwLock<IndexMap<String, StaticPathMethods<T>>>,
}
impl<T: Clone> Default for Router<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: Clone> Router<T> {
pub fn new() -> Self {
Self {
root: RwLock::new(Box::new(Node::new())),
static_map: RwLock::new(IndexMap::default()),
}
}
}