use std::collections::HashSet;
use salvo_core::handler::Skipper;
use salvo_core::http::Method;
use salvo_core::{Depot, Request};
#[derive(Default, Clone, Debug)]
pub struct MethodSkipper {
skipped_methods: HashSet<Method>,
}
impl MethodSkipper {
pub fn new() -> Self {
Self {
skipped_methods: HashSet::new(),
}
}
pub fn skip_get(self, value: bool) -> Self {
self.skip_method(Method::GET, value)
}
pub fn skip_post(self, value: bool) -> Self {
self.skip_method(Method::POST, value)
}
pub fn skip_put(self, value: bool) -> Self {
self.skip_method(Method::PUT, value)
}
pub fn skip_delete(self, value: bool) -> Self {
self.skip_method(Method::DELETE, value)
}
pub fn skip_head(self, value: bool) -> Self {
self.skip_method(Method::HEAD, value)
}
pub fn skip_patch(self, value: bool) -> Self {
self.skip_method(Method::PATCH, value)
}
pub fn skip_options(self, value: bool) -> Self {
self.skip_method(Method::OPTIONS, value)
}
pub fn skip_connect(self, value: bool) -> Self {
self.skip_method(Method::CONNECT, value)
}
pub fn skip_trace(self, value: bool) -> Self {
self.skip_method(Method::TRACE, value)
}
pub fn skip_method(mut self, method: Method, value: bool) -> Self {
if value {
self.skipped_methods.insert(method);
} else {
self.skipped_methods.remove(&method);
}
self
}
pub fn skip_all(mut self) -> Self {
self.skipped_methods = [
Method::GET,
Method::POST,
Method::PUT,
Method::DELETE,
Method::HEAD,
Method::PATCH,
Method::OPTIONS,
Method::CONNECT,
Method::TRACE,
]
.into_iter()
.collect();
self
}
}
impl Skipper for MethodSkipper {
fn skipped(&self, req: &mut Request, _depot: &Depot) -> bool {
self.skipped_methods.contains(req.method())
}
}