1use crate::SysErrorCode;
4
5pub fn http_status_for_sys(sys: u16) -> u16 {
16 let head = sys / 100; match head {
18 404 => 404,
19 422 => 422,
20 204 => 204,
21 499 => 499,
22 502 => 502,
23 503 => 503,
24 500 => 500,
25 _ => 500,
26 }
27}
28
29pub fn http_status_for_reason<R: SysErrorCode>(r: &R) -> u16 {
31 http_status_for_sys(r.sys_code())
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn test_http_status_404() {
40 assert_eq!(http_status_for_sys(40401), 404);
41 assert_eq!(http_status_for_sys(40402), 404);
42 assert_eq!(http_status_for_sys(40411), 404);
43 assert_eq!(http_status_for_sys(40412), 404);
44 }
45
46 #[test]
47 fn test_http_status_422() {
48 assert_eq!(http_status_for_sys(42201), 422);
49 assert_eq!(http_status_for_sys(42211), 422);
50 assert_eq!(http_status_for_sys(42212), 422);
51 assert_eq!(http_status_for_sys(42299), 422);
52 }
53
54 #[test]
55 fn test_http_status_204() {
56 assert_eq!(http_status_for_sys(20401), 204);
57 assert_eq!(http_status_for_sys(20402), 204);
58 }
59
60 #[test]
61 fn test_http_status_499() {
62 assert_eq!(http_status_for_sys(49901), 499);
63 assert_eq!(http_status_for_sys(49999), 499);
64 }
65
66 #[test]
67 fn test_http_status_502() {
68 assert_eq!(http_status_for_sys(50201), 502);
69 assert_eq!(http_status_for_sys(50209), 502);
70 }
71
72 #[test]
73 fn test_http_status_503() {
74 assert_eq!(http_status_for_sys(50301), 503);
75 assert_eq!(http_status_for_sys(50311), 503);
76 assert_eq!(http_status_for_sys(50312), 503);
77 }
78
79 #[test]
80 fn test_http_status_500() {
81 assert_eq!(http_status_for_sys(50001), 500);
82 assert_eq!(http_status_for_sys(50009), 500);
83 assert_eq!(http_status_for_sys(50041), 500);
84 }
85
86 #[test]
87 fn test_http_status_default_fallback() {
88 assert_eq!(http_status_for_sys(10001), 500);
90 assert_eq!(http_status_for_sys(60001), 500);
91 assert_eq!(http_status_for_sys(0), 500);
92 }
93
94 #[test]
95 fn test_http_status_for_reason() {
96 struct TestReason(u16);
97 impl SysErrorCode for TestReason {
98 fn sys_code(&self) -> u16 {
99 self.0
100 }
101 }
102
103 let r404 = TestReason(40401);
104 assert_eq!(http_status_for_reason(&r404), 404);
105
106 let r422 = TestReason(42201);
107 assert_eq!(http_status_for_reason(&r422), 422);
108
109 let r500 = TestReason(50001);
110 assert_eq!(http_status_for_reason(&r500), 500);
111 }
112}