use crate::router::{
handler::{BoxedHandler, Handler, HandlerWrapper},
Request,
};
use coap_lite::RequestType as Method;
pub struct MethodRouter<S> {
get: Option<BoxedHandler<S>>,
delete: Option<BoxedHandler<S>>,
post: Option<BoxedHandler<S>>,
put: Option<BoxedHandler<S>>,
fallback: Option<BoxedHandler<S>>,
}
impl<S: Clone + Send + Sync + 'static> MethodRouter<S> {
pub fn get<H, T>(self, handler: H) -> Self
where
T: Send + Sync + 'static,
H: Handler<T, S>,
{
let handler = Box::new(HandlerWrapper::new(handler));
Self {
get: Some(handler),
..self
}
}
pub fn delete<H, T>(self, handler: H) -> Self
where
T: Send + Sync + 'static,
H: Handler<T, S>,
{
let handler = Box::new(HandlerWrapper::new(handler));
Self {
delete: Some(handler),
..self
}
}
pub fn post<H, T>(self, handler: H) -> Self
where
T: Send + Sync + 'static,
H: Handler<T, S>,
{
let handler = Box::new(HandlerWrapper::new(handler));
Self {
post: Some(handler),
..self
}
}
pub fn put<H, T>(self, handler: H) -> Self
where
T: Send + Sync + 'static,
H: Handler<T, S>,
{
let handler = Box::new(HandlerWrapper::new(handler));
Self {
put: Some(handler),
..self
}
}
pub fn fallback<H, T>(self, handler: H) -> Self
where
T: Send + Sync + 'static,
H: Handler<T, S>,
{
let handler = Box::new(HandlerWrapper::new(handler));
Self {
fallback: Some(handler),
..self
}
}
pub(crate) async fn try_handle(&self, request: Request, state: S) -> Result<Request, Request> {
let handler = match request.method() {
Method::Get => self.get.as_ref(),
Method::Delete => self.delete.as_ref(),
Method::Post => self.post.as_ref(),
Method::Put => self.put.as_ref(),
_ => None,
};
if let Some(handler) = handler {
Ok(handler.clone().call(request, state.clone()).await)
} else if let Some(fallback) = self.fallback.as_ref() {
Ok(fallback.clone().call(request, state.clone()).await)
} else {
Err(request)
}
}
}
pub fn get<H, T, S>(handler: H) -> MethodRouter<S>
where
T: Send + Sync + 'static,
H: Handler<T, S>,
S: Send + Sync + 'static,
{
let handler = Box::new(HandlerWrapper::new(handler));
MethodRouter {
get: Some(handler),
delete: None,
post: None,
put: None,
fallback: None,
}
}
pub fn delete<H, T, S>(handler: H) -> MethodRouter<S>
where
T: Send + Sync + 'static,
H: Handler<T, S>,
S: Send + Sync + 'static,
{
let handler = Box::new(HandlerWrapper::new(handler));
MethodRouter {
get: None,
delete: Some(handler),
post: None,
put: None,
fallback: None,
}
}
pub fn post<H, T, S>(handler: H) -> MethodRouter<S>
where
T: Send + Sync + 'static,
H: Handler<T, S>,
S: Send + Sync + 'static,
{
let handler = Box::new(HandlerWrapper::new(handler));
MethodRouter {
get: None,
delete: None,
post: Some(handler),
put: None,
fallback: None,
}
}
pub fn put<H, T, S>(handler: H) -> MethodRouter<S>
where
T: Send + Sync + 'static,
H: Handler<T, S>,
S: Send + Sync + 'static,
{
let handler = Box::new(HandlerWrapper::new(handler));
MethodRouter {
get: None,
delete: None,
post: None,
put: Some(handler),
fallback: None,
}
}
pub fn fallback<H, T, S>(handler: H) -> MethodRouter<S>
where
T: Send + Sync + 'static,
H: Handler<T, S>,
S: Send + Sync + 'static,
{
let handler = Box::new(HandlerWrapper::new(handler));
MethodRouter {
get: None,
delete: None,
post: None,
put: None,
fallback: Some(handler),
}
}