simbld_http/helpers/
response_macros.rs1#[macro_export]
7macro_rules! generate_http_response_functions {
8 ($($enum:ty),*) => {
9 $(
10 impl $crate::helpers::response_functions::ResponseFunctions for $enum
11 where
12 $enum: strum::IntoEnumIterator + std::fmt::Debug + Copy + ToString + Into<u16>,
13 {
14 fn generate_responses() {
15 for variant in <$enum>::iter() {
16 let variant_string = variant.to_string();
17 let function_name_snake = inflector::cases::snakecase::to_snake_case(&variant_string);
18 let function_name_camel = inflector::cases::camelcase::to_camel_case(&variant_string);
19 let function_name_pascal = inflector::cases::classcase::to_class_case(&variant_string);
20 let code: u16 = variant.into();
21
22
23 println!(
24 "fn {}() -> (u16, &'static str) {{ ({}, {:?}) }}",
25 function_name_snake,
26 code,
27 variant
28 );
29
30 println!(
31 "fn {}() -> (u16, &'static str) {{ ({}, {:?}) }}",
32 function_name_camel,
33 code,
34 variant
35 );
36
37 println!(
38 "fn {}() -> (u16, &'static str) {{ ({}, {:?}) }}",
39 function_name_pascal,
40 code,
41 variant
42 );
43 }
44 }
45
46 fn generate_responses_with_metadata() {
47 for variant in <$enum>::iter() {
48 let variant_string = variant.to_string();
49 let function_name_snake = inflector::cases::snakecase::to_snake_case(&variant_string);
50 let function_name_camel = inflector::cases::camelcase::to_camel_case(&variant_string);
51 let function_name_pascal = inflector::cases::classcase::to_class_case(&variant_string);
52 let code: u16 = variant.into();
53
54 println!(
55 "fn {}() -> String {{ response_helpers::get_enriched_response_with_metadata({}, None, std::time::Duration::from_millis(100)) }}",
56 function_name_snake,
57 code
58 );
59
60 println!(
61 "fn {}() -> String {{ response_helpers::get_enriched_response_with_metadata({}, None, std::time::Duration::from_millis(100)) }}",
62 function_name_camel,
63 code
64 );
65
66 println!(
67 "fn {}() -> String {{ response_helpers::get_enriched_response_with_metadata({}, None, std::time::Duration::from_millis(100)) }}",
68 function_name_pascal,
69 code
70 );
71 }
72 }
73 }
74 )*
75 };
76}
77
78#[test]
79fn test_generated_functions_success() {
80 let response = crate::ResponsesSuccessCodes::Ok;
81 let (code, description): (u16, &str) = response.into();
82 assert_eq!(code, 200);
83 assert_eq!(
84 description,
85 "Request processed successfully. Response will depend on the request method used, and the result will be either a representation of the requested resource or an empty response"
86 );
87}
88
89#[cfg(test)]
90mod tests {
91 use crate::helpers::response_functions::ResponseFunctions;
92 use std::io::{stdout, Write};
93 use std::sync::{Arc, Mutex};
94
95 #[test]
96 fn test_generate_responses_with_metadata() {
97 let buffer = Arc::new(Mutex::new(Vec::new()));
99 let buffer_clone = Arc::clone(&buffer);
100
101 let original_stdout = stdout();
103 let mut locked_stdout = original_stdout.lock();
104 let mut locked_buffer = buffer_clone.lock().unwrap();
105
106 let _ = write!(&mut locked_buffer, ""); let _ = write!(&mut locked_stdout, ""); crate::ResponsesSuccessCodes::generate_responses_with_metadata();
112
113 let output = String::from_utf8(buffer.lock().unwrap().clone()).expect("Invalid UTF-8");
115
116 assert!(output.contains("fn ok() -> String"));
118 assert!(output.contains("response_helpers::get_enriched_response_with_metadata(200"));
119 }
120
121 #[test]
122 fn test_function_presence() {
123 crate::ResponsesSuccessCodes::generate_responses_with_metadata();
125 }
126}