salvo_cache/
skipper.rs

1use std::collections::HashSet;
2
3use salvo_core::handler::Skipper;
4use salvo_core::http::Method;
5use salvo_core::{Depot, Request};
6
7/// Skipper for `Method`. You can use it to skip some methods.
8///
9/// If the request method is in the skip list, the request will be skipped.
10#[derive(Default, Clone, Debug)]
11pub struct MethodSkipper {
12    skipped_methods: HashSet<Method>,
13}
14impl MethodSkipper {
15    /// Create a new `MethodSkipper`.
16    pub fn new() -> Self {
17        Self {
18            skipped_methods: HashSet::new(),
19        }
20    }
21    /// Add the [`Method::GET`] method to skipped methods.
22    pub fn skip_get(self, value: bool) -> Self {
23        self.skip_method(Method::GET, value)
24    }
25    /// Add the [`Method::POST`] method to skipped methods.
26    pub fn skip_post(self, value: bool) -> Self {
27        self.skip_method(Method::POST, value)
28    }
29    /// Add the [`Method::PUT`] method to skipped methods.
30    pub fn skip_put(self, value: bool) -> Self {
31        self.skip_method(Method::PUT, value)
32    }
33    /// Add the [`Method::DELETE`] method to skipped methods.
34    pub fn skip_delete(self, value: bool) -> Self {
35        self.skip_method(Method::DELETE, value)
36    }
37    /// Add the [`Method::HEAD`] method to skipped methods.
38    pub fn skip_head(self, value: bool) -> Self {
39        self.skip_method(Method::HEAD, value)
40    }
41    /// Add the [`Method::PATCH`] method to skipped methods.
42    pub fn skip_patch(self, value: bool) -> Self {
43        self.skip_method(Method::PATCH, value)
44    }
45    /// Add the [`Method::OPTIONS`] method to skipped methods.
46    pub fn skip_options(self, value: bool) -> Self {
47        self.skip_method(Method::OPTIONS, value)
48    }
49    /// Add the [`Method::CONNECT`] method to skipped methods.
50    pub fn skip_connect(self, value: bool) -> Self {
51        self.skip_method(Method::CONNECT, value)
52    }
53    /// Add the [`Method::TRACE`] method to skipped methods.
54    pub fn skip_trace(self, value: bool) -> Self {
55        self.skip_method(Method::TRACE, value)
56    }
57    /// Add a [`Method`] to skipped methods.
58    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    /// Add all methods to skipped methods.
67    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}