simbld_http/responses/
mod.rs

1pub mod actix_responder;
2pub mod client;
3pub mod crawler;
4pub mod informational;
5pub mod local;
6pub mod redirection;
7pub mod server;
8pub mod service;
9pub mod success;
10pub mod wrapper;
11
12pub use actix_responder::CustomResponse;
13pub use client::ResponsesClientCodes;
14pub use crawler::ResponsesCrawlerCodes;
15pub use informational::ResponsesInformationalCodes;
16pub use local::ResponsesLocalApiCodes;
17pub use redirection::ResponsesRedirectionCodes;
18pub use server::ResponsesServerCodes;
19pub use service::ResponsesServiceCodes;
20pub use success::ResponsesSuccessCodes;
21pub use wrapper::ResponseWrapper;
22
23use crate::helpers::{from_u16_helper::FromU16, to_u16_helper::ToU16};
24use strum::EnumProperty;
25use strum::IntoEnumIterator;
26use strum_macros::EnumProperty;
27
28/// Enum representing all HTTP response families.
29#[derive(Debug, Clone, Copy, EnumProperty)]
30pub enum ResponsesTypes {
31  Informational(ResponsesInformationalCodes),
32  Success(ResponsesSuccessCodes),
33  Redirection(ResponsesRedirectionCodes),
34  ClientError(ResponsesClientCodes),
35  ServerError(ResponsesServerCodes),
36  ServiceError(ResponsesServiceCodes),
37  CrawlerError(ResponsesCrawlerCodes),
38  LocalApiError(ResponsesLocalApiCodes),
39}
40
41generate_http_response_functions!(
42  ResponsesClientCodes,
43  ResponsesCrawlerCodes,
44  ResponsesInformationalCodes,
45  ResponsesLocalApiCodes,
46  ResponsesRedirectionCodes,
47  ResponsesServerCodes,
48  ResponsesServiceCodes,
49  ResponsesSuccessCodes
50);
51
52impl ResponsesTypes {
53  /// Converts a `u16` to a `ResponsesTypes` corresponding to one of the families.
54  pub fn from_u16(code: u16) -> Option<Self> {
55    if let Some(info_code) = ResponsesInformationalCodes::from_u16(code) {
56      return Some(ResponsesTypes::Informational(info_code));
57    }
58    if let Some(success_code) = ResponsesSuccessCodes::from_u16(code) {
59      return Some(ResponsesTypes::Success(success_code));
60    }
61    if let Some(redirect_code) = ResponsesRedirectionCodes::from_u16(code) {
62      return Some(ResponsesTypes::Redirection(redirect_code));
63    }
64    if let Some(client_error) = ResponsesClientCodes::from_u16(code) {
65      return Some(ResponsesTypes::ClientError(client_error));
66    }
67    if let Some(server_error) = ResponsesServerCodes::from_u16(code) {
68      return Some(ResponsesTypes::ServerError(server_error));
69    }
70    if let Some(service_error) = ResponsesServiceCodes::from_u16(code) {
71      return Some(ResponsesTypes::ServiceError(service_error));
72    }
73    if let Some(crawler_error) = ResponsesCrawlerCodes::from_u16(code) {
74      return Some(ResponsesTypes::CrawlerError(crawler_error));
75    }
76    if let Some(local_api_error) = ResponsesLocalApiCodes::from_u16(code) {
77      return Some(ResponsesTypes::LocalApiError(local_api_error));
78    }
79    None
80  }
81
82  /// Returns the description associated with a response code.
83  pub fn description(&self) -> &'static str {
84    match self {
85      ResponsesTypes::Informational(code_enum) => {
86        code_enum.get_str("Description").unwrap_or("No description")
87      },
88      ResponsesTypes::Success(code_enum) => {
89        code_enum.get_str("Description").unwrap_or("No description")
90      },
91      ResponsesTypes::Redirection(code_enum) => {
92        code_enum.get_str("Description").unwrap_or("No description")
93      },
94      ResponsesTypes::ClientError(code_enum) => {
95        code_enum.get_str("Description").unwrap_or("No description")
96      },
97      ResponsesTypes::ServerError(code_enum) => {
98        code_enum.get_str("Description").unwrap_or("No description")
99      },
100      ResponsesTypes::ServiceError(code_enum) => {
101        code_enum.get_str("Description").unwrap_or("No description")
102      },
103      ResponsesTypes::CrawlerError(code_enum) => {
104        code_enum.get_str("Description").unwrap_or("No description")
105      },
106      ResponsesTypes::LocalApiError(code_enum) => {
107        code_enum.get_str("Description").unwrap_or("No description")
108      },
109    }
110  }
111
112  pub fn get_response_description(&self) -> (u16, &'static str) {
113    match self {
114      ResponsesTypes::Informational(code) => {
115        (code.to_u16(), code.get_str("Description").unwrap_or(""))
116      },
117      ResponsesTypes::Success(code) => (code.to_u16(), code.get_str("Description").unwrap_or("")),
118      ResponsesTypes::Redirection(code) => {
119        (code.to_u16(), code.get_str("Description").unwrap_or(""))
120      },
121      ResponsesTypes::ClientError(code) => {
122        (code.to_u16(), code.get_str("Description").unwrap_or(""))
123      },
124      ResponsesTypes::ServerError(code) => {
125        (code.to_u16(), code.get_str("Description").unwrap_or(""))
126      },
127      ResponsesTypes::ServiceError(code) => {
128        (code.to_u16(), code.get_str("Description").unwrap_or(""))
129      },
130      ResponsesTypes::CrawlerError(code) => {
131        (code.to_u16(), code.get_str("Description").unwrap_or(""))
132      },
133      ResponsesTypes::LocalApiError(code) => {
134        (code.to_u16(), code.get_str("Description").unwrap_or(""))
135      },
136    }
137  }
138}
139
140/// Implementation to convert a `ResponsesTypes` to `u16`.
141impl ToU16 for ResponsesTypes {
142  fn to_u16(self) -> u16 {
143    match self {
144      ResponsesTypes::Informational(code_enum) => code_enum.to_u16(),
145      ResponsesTypes::Success(code_enum) => code_enum.to_u16(),
146      ResponsesTypes::Redirection(code_enum) => code_enum.to_u16(),
147      ResponsesTypes::ClientError(code_enum) => code_enum.to_u16(),
148      ResponsesTypes::ServerError(code_enum) => code_enum.to_u16(),
149      ResponsesTypes::ServiceError(code_enum) => code_enum.to_u16(),
150      ResponsesTypes::CrawlerError(code_enum) => code_enum.to_u16(),
151      ResponsesTypes::LocalApiError(code_enum) => code_enum.to_u16(),
152    }
153  }
154}