1use std::collections::HashSet;
2
3use salvo_core::handler::Skipper;
4use salvo_core::http::Method;
5use salvo_core::{Depot, Request};
6
7#[derive(Default, Clone, Debug)]
11pub struct MethodSkipper {
12 skipped_methods: HashSet<Method>,
13}
14impl MethodSkipper {
15 pub fn new() -> Self {
17 Self {
18 skipped_methods: HashSet::new(),
19 }
20 }
21 pub fn skip_get(self, value: bool) -> Self {
23 self.skip_method(Method::GET, value)
24 }
25 pub fn skip_post(self, value: bool) -> Self {
27 self.skip_method(Method::POST, value)
28 }
29 pub fn skip_put(self, value: bool) -> Self {
31 self.skip_method(Method::PUT, value)
32 }
33 pub fn skip_delete(self, value: bool) -> Self {
35 self.skip_method(Method::DELETE, value)
36 }
37 pub fn skip_head(self, value: bool) -> Self {
39 self.skip_method(Method::HEAD, value)
40 }
41 pub fn skip_patch(self, value: bool) -> Self {
43 self.skip_method(Method::PATCH, value)
44 }
45 pub fn skip_options(self, value: bool) -> Self {
47 self.skip_method(Method::OPTIONS, value)
48 }
49 pub fn skip_connect(self, value: bool) -> Self {
51 self.skip_method(Method::CONNECT, value)
52 }
53 pub fn skip_trace(self, value: bool) -> Self {
55 self.skip_method(Method::TRACE, value)
56 }
57 pub fn skip_method(mut self, method: Method, value: bool) -> Self {
59 if value {
60 self.skipped_methods.insert(method);
61 } else {
62 self.skipped_methods.remove(&method);
63 }
64 self
65 }
66 pub fn skip_all(mut self) -> Self {
68 self.skipped_methods = [
69 Method::GET,
70 Method::POST,
71 Method::PUT,
72 Method::DELETE,
73 Method::HEAD,
74 Method::PATCH,
75 Method::OPTIONS,
76 Method::CONNECT,
77 Method::TRACE,
78 ]
79 .into_iter()
80 .collect();
81 self
82 }
83}
84impl Skipper for MethodSkipper {
85 fn skipped(&self, req: &mut Request, _depot: &Depot) -> bool {
86 self.skipped_methods.contains(req.method())
87 }
88}