atelier/shelves/backend/routes/mod.rs
2025-04-12 00:02:40 -04:00

68 lines
1.6 KiB
Rust

mod hello;
mod home;
mod items;
mod shelves;
use atelier::router::methods::*;
use std::pin::Pin;
use crate::prelude::*;
fn make_handler<Fut, F, R>(f: F) -> Handler
where
Fut: Future<Output = R> + Send + 'static,
F: FnMut(Request, RequestCtx) -> Fut + Clone + Send + Sync + 'static,
R: IntoResponse,
{
Box::new(move |req, ctx| {
let mut f = f.clone();
Box::pin(async move { f(req, ctx).await.into_response() })
})
}
pub fn route(dbs: DbS, req: Request) -> Response {
let method = Some(req.method().as_str());
let uri = format!("{}", req.uri());
let path_parts: Vec<_> = uri.split('/').collect();
match path_parts.as_slice() {
&[] => match method.take() {
GET => return home::view(),
}
};
match method {
None => (http::status::StatusCode::from_u16(405), "Method not allowed").into_response(),
Some(_) => (http::status::StatusCode::from_u16(404), "Not found").into_response(),
}
}
pub fn make_router() -> Router {
let mut router = atelier::router::Router::new();
macro_rules! r {
($m:expr, $p:expr, $h:expr) => {
router.register($m, $p, make_handler($h))
};
}
r!(GET, "/", home::view);
r!(GET, "/shelves", shelves::view);
r!(GET, "/shelves/:shelf_xid", shelves::view_one);
r!(GET, "/items", items::view);
r!(GET, "/items/create", items::view_create);
r!(GET, "/items/:item_xid", items::view_one);
r!(POST, "/items/create", items::post_create);
r!(GET, "/hello/:name", hello::view);
r!(GET, "/static/*", serve_static);
router
}
pub async fn serve_static(req: Request, ctx: RequestCtx) -> Response {
let url = req.uri().path();
"".into_response()
}