simbld_http/helpers/
response_macros.rs

1/// This Rust code defines a macro `generate_http_response_functions` that generates response functions for enums implementing the `ResponseFunctions` trait. Here's a breakdown of what the macro does:
2/// - The macro takes a list of enum types as arguments.
3/// - For each enum type, the macro generates functions for each variant of the enum.
4/// - The generated functions return a tuple containing the HTTP status code and the description of the response.
5/// - The generated functions are named based on the snake_case, camelCase, and PascalCase versions of the variant name.
6#[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    // Créer un buffer protégé par un Mutex pour capturer stdout
98    let buffer = Arc::new(Mutex::new(Vec::new()));
99    let buffer_clone = Arc::clone(&buffer);
100
101    // Rediriger stdout vers le buffer
102    let original_stdout = stdout();
103    let mut locked_stdout = original_stdout.lock();
104    let mut locked_buffer = buffer_clone.lock().unwrap();
105
106    // Rediriger les sorties dans le buffer
107    let _ = write!(&mut locked_buffer, ""); // Préparer le buffer
108    let _ = write!(&mut locked_stdout, ""); // Éviter des problèmes avec stdout
109
110    // Appeler la fonction générée par la macro
111    crate::ResponsesSuccessCodes::generate_responses_with_metadata();
112
113    // Lire les données capturées
114    let output = String::from_utf8(buffer.lock().unwrap().clone()).expect("Invalid UTF-8");
115
116    // Vérifier que les données générées contiennent les valeurs attendues
117    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    // Vérifie que les fonctions générées existent
124    crate::ResponsesSuccessCodes::generate_responses_with_metadata();
125  }
126}