rust_web_server/error/
mod.rs1#[cfg(test)]
2mod tests;
3
4use crate::header::Header;
5use crate::mime_type::MimeType;
6use crate::range::Range;
7use crate::request::Request;
8use crate::response::{Response, STATUS_CODE_REASON_PHRASE};
9
10pub trait IntoResponse {
18 fn into_response(self) -> Response;
19}
20
21impl IntoResponse for Response {
22 fn into_response(self) -> Response {
23 self
24 }
25}
26
27#[derive(Debug, PartialEq, Eq)]
47pub enum AppError {
48 BadRequest(String),
50 Unauthorized,
52 Forbidden,
54 NotFound(String),
56 Conflict(String),
58 UnprocessableEntity(String),
60 TooManyRequests,
62 PayloadTooLarge(String),
64 Internal(String),
66}
67
68impl IntoResponse for AppError {
69 fn into_response(self) -> Response {
70 let (status, body_str) = match &self {
71 AppError::BadRequest(msg) => (STATUS_CODE_REASON_PHRASE.n400_bad_request, msg.as_str()),
72 AppError::Unauthorized => (STATUS_CODE_REASON_PHRASE.n401_unauthorized, "Unauthorized"),
73 AppError::Forbidden => (STATUS_CODE_REASON_PHRASE.n403_forbidden, "Forbidden"),
74 AppError::NotFound(msg) => (STATUS_CODE_REASON_PHRASE.n404_not_found, msg.as_str()),
75 AppError::Conflict(msg) => (STATUS_CODE_REASON_PHRASE.n409_conflict, msg.as_str()),
76 AppError::UnprocessableEntity(msg) => (STATUS_CODE_REASON_PHRASE.n422_unprocessable_entity, msg.as_str()),
77 AppError::TooManyRequests => (STATUS_CODE_REASON_PHRASE.n429_too_many_requests, "Too Many Requests"),
78 AppError::PayloadTooLarge(msg) => (STATUS_CODE_REASON_PHRASE.n413_payload_too_large, msg.as_str()),
79 AppError::Internal(msg) => (STATUS_CODE_REASON_PHRASE.n500_internal_server_error, msg.as_str()),
80 };
81
82 let dummy = Request {
83 method: "GET".to_string(),
84 request_uri: "/".to_string(),
85 http_version: "HTTP/1.1".to_string(),
86 headers: vec![],
87 body: vec![],
88 };
89 let header_list = Header::get_header_list(&dummy);
90 let body = body_str.as_bytes().to_vec();
91 let content_range = Range::get_content_range(body, MimeType::TEXT_PLAIN.to_string());
92 Response::get_response(status, Some(header_list), Some(vec![content_range]))
93 }
94}