api_tools/server/axum/layers/
mod.rs1pub mod basic_auth;
4pub mod cors;
5pub mod http_errors;
6pub mod logger;
7#[cfg(feature = "prometheus")]
8pub mod prometheus;
9pub mod request_id;
10pub mod time_limiter;
11
12use crate::server::axum::response::ApiErrorResponse;
13use axum::http::header::CONTENT_TYPE;
14use axum::http::response::Parts;
15use axum::http::{HeaderName, HeaderValue, StatusCode};
16use bytes::Bytes;
17use std::str::from_utf8;
18
19pub fn body_from_parts(
21 parts: &mut Parts,
22 status_code: StatusCode,
23 message: &str,
24 headers: Option<Vec<(HeaderName, HeaderValue)>>,
25) -> Bytes {
26 parts.status = status_code;
28
29 parts
31 .headers
32 .insert(CONTENT_TYPE, HeaderValue::from_static(mime::APPLICATION_JSON.as_ref()));
33 if let Some(headers) = headers {
34 for header in headers {
35 parts.headers.insert(header.0, header.1);
36 }
37 }
38
39 let msg = serde_json::json!(ApiErrorResponse::new(status_code, message));
41
42 Bytes::from(msg.to_string())
43}
44
45pub fn header_value_to_str(value: Option<&HeaderValue>) -> &str {
47 match value {
48 Some(value) => from_utf8(value.as_bytes()).unwrap_or_default(),
49 None => "",
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn test_header_value_to_str() {
59 let header_value = HeaderValue::from_static("test_value");
60 let result = header_value_to_str(Some(&header_value));
61 assert_eq!(result, "test_value");
62
63 let none_result = header_value_to_str(None);
64 assert_eq!(none_result, "");
65 }
66}