#[cfg(feature = "macros")]
use crate::pages::Page;
#[cfg(not(feature = "macros"))]
#[derive(Copy, Clone)]
struct Page {
#[allow(dead_code)]
path: &'static str,
handler: fn()
}
#[derive(Default)]
pub struct Router {
pages: Vec<Page>
}
impl Router {
pub fn new() -> Self {
Self::default()
}
pub fn register(mut self, path: &'static str, handler: fn()) -> Self {
self.pages.push(Page {
path,
handler
});
self
}
pub fn start(self) {
for page in self.pages {
(page.handler)();
}
}
}
#[cfg(test)]
mod tests {
use std::sync::atomic::{AtomicUsize, Ordering};
use super::*;
fn noop() {}
#[test]
fn registers_pages() {
let router = Router::new().register("/", noop);
assert_eq!(router.pages.len(), 1);
}
static COUNT: AtomicUsize = AtomicUsize::new(0);
fn handler() {
COUNT.fetch_add(1, Ordering::SeqCst);
}
#[test]
fn starts_registered_pages() {
COUNT.store(0, Ordering::SeqCst);
Router::new().register("/", handler).start();
assert_eq!(COUNT.load(Ordering::SeqCst), 1);
}
}