pub mod router;
use router::Router;
use std::fmt::Debug;
use crate::Dom;
#[derive(Debug, Clone)]
pub struct App<S: 'static> {
router: Router<S>,
state: S,
}
impl<S: Clone + 'static> App<S> {
pub fn new(state: S) -> Self {
Self {
state,
router: Router::new(),
}
}
pub fn state(&self) -> &S {
&self.state
}
pub fn router(&self) -> &Router<S> {
&self.router
}
pub fn route(&mut self, path: impl AsRef<str>, page: fn(&Self) -> Dom) {
self.router
.handler
.insert(path.as_ref().to_string(), page)
.unwrap();
}
pub fn set_not_found(&mut self, page: fn(&Self) -> Dom) {
self.router.set_not_found(page);
}
}
impl<S: Clone + 'static> App<S> {
pub fn mount(&self) {
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let router = self.router.clone();
let dom = router.render(
self,
&crate::Dom::new_from_node(&document.body().unwrap().into()),
);
std::mem::forget(dom);
}
pub fn mount_to(&self, parent: &web_sys::Node) {
let router = self.router.clone();
let dom = router.render(self, &crate::Dom::new_from_node(parent));
std::mem::forget(dom);
}
pub fn mount_with(&self, parent: &web_sys::Node, cb: impl Fn(&Self) -> Dom) {
let res = cb(self);
parent.append_child(&res.inner_element()).unwrap();
std::mem::forget(res);
}
}