apimock_server/
respond_response.rs1use apimock_routing::{ParsedRequest, Respond};
12use console::style;
13use std::path::Path;
14
15use crate::{
16 http_util::delay_response,
17 respond_util::full_file_path,
18 response::{
19 error_response::internal_server_error_response,
20 file_response::FileResponse,
21 status_code_response::{status_code_response, status_code_response_with_message},
22 text_response::text_response,
23 },
24 types::BoxBody,
25};
26
27pub async fn respond_response(
41 respond: &Respond,
42 dir_prefix: &str,
43 parsed_request: &ParsedRequest,
44) -> Result<hyper::Response<BoxBody>, hyper::http::Error> {
45 if let Some(delay_ms) = respond.delay_response_milliseconds {
46 delay_response(delay_ms).await;
47 }
48
49 let request_headers = &parsed_request.component_parts.headers;
50
51 if let Some(file_path) = respond.file_path.as_ref() {
53 let Some(full_file_path) = full_file_path(file_path.as_str(), dir_prefix) else {
54 log::error!(
55 "{}:\n{} (prefix = {})",
56 style("file not found").red(),
57 file_path,
58 dir_prefix,
59 );
60 return internal_server_error_response("failed to get response file", request_headers);
61 };
62
63 let _ = Path::new(dir_prefix);
66
67 return FileResponse::new_with_csv_records_jsonpath(
68 full_file_path.as_str(),
69 respond.headers.as_ref(),
70 respond.csv_records_key.clone(),
71 request_headers,
72 )
73 .file_content_response()
74 .await;
75 }
76
77 if let Some(text) = respond.text.as_ref() {
78 return match respond.status_code.as_ref() {
79 Some(status_code) => {
80 status_code_response_with_message(status_code, text.as_str(), request_headers)
81 }
82 None => text_response(
83 text.as_str(),
84 None,
85 respond.headers.as_ref(),
86 request_headers,
87 ),
88 };
89 }
90
91 if let Some(status_code) = respond.status_code.as_ref() {
92 return status_code_response(status_code, request_headers);
93 }
94
95 internal_server_error_response("invalid respond def", request_headers)
96}