Skip to main content

io_http/rfc9110/
status.rs

1//! HTTP status code ([RFC 9110 §15]).
2//!
3//! [RFC 9110 §15]: https://www.rfc-editor.org/rfc/rfc9110#section-15
4
5use core::ops::Deref;
6
7/// HTTP status code.
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9pub struct StatusCode(pub u16);
10
11impl StatusCode {
12    /// Returns `true` if the status code is in the `2xx` range.
13    pub fn is_success(self) -> bool {
14        self.0 >= 200 && self.0 < 300
15    }
16
17    /// Returns `true` if the status code is in the `3xx` range.
18    pub fn is_redirection(self) -> bool {
19        self.0 >= 300 && self.0 < 400
20    }
21}
22
23impl Deref for StatusCode {
24    type Target = u16;
25
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use crate::rfc9110::status::*;
34
35    #[test]
36    fn success_range() {
37        assert!(StatusCode(200).is_success());
38        assert!(StatusCode(204).is_success());
39        assert!(StatusCode(299).is_success());
40        assert!(!StatusCode(199).is_success());
41        assert!(!StatusCode(300).is_success());
42    }
43
44    #[test]
45    fn redirection_range() {
46        assert!(StatusCode(300).is_redirection());
47        assert!(StatusCode(301).is_redirection());
48        assert!(StatusCode(399).is_redirection());
49        assert!(!StatusCode(299).is_redirection());
50        assert!(!StatusCode(400).is_redirection());
51    }
52}