simbld_http/helpers/
response_macros.rs#[macro_export]
macro_rules! generate_http_response_functions {
($($enum:ty),*) => {
$(
impl $crate::helpers::response_functions::ResponseFunctions for $enum
where
$enum: strum::IntoEnumIterator + std::fmt::Debug + Copy + ToString + Into<u16>,
{
fn generate_responses() {
for variant in <$enum>::iter() {
let variant_string = variant.to_string();
let function_name_snake = inflector::cases::snakecase::to_snake_case(&variant_string);
let function_name_camel = inflector::cases::camelcase::to_camel_case(&variant_string);
let function_name_pascal = inflector::cases::classcase::to_class_case(&variant_string);
let code: u16 = variant.into();
println!(
"fn {}() -> (u16, &'static str) {{ ({}, {:?}) }}",
function_name_snake,
code,
variant
);
println!(
"fn {}() -> (u16, &'static str) {{ ({}, {:?}) }}",
function_name_camel,
code,
variant
);
println!(
"fn {}() -> (u16, &'static str) {{ ({}, {:?}) }}",
function_name_pascal,
code,
variant
);
}
}
fn generate_responses_with_metadata() {
for variant in <$enum>::iter() {
let variant_string = variant.to_string();
let function_name_snake = inflector::cases::snakecase::to_snake_case(&variant_string);
let function_name_camel = inflector::cases::camelcase::to_camel_case(&variant_string);
let function_name_pascal = inflector::cases::classcase::to_class_case(&variant_string);
let code: u16 = variant.into();
println!(
"fn {}() -> String {{ response_helpers::get_enriched_response_with_metadata({}, None, std::time::Duration::from_millis(100)) }}",
function_name_snake,
code
);
println!(
"fn {}() -> String {{ response_helpers::get_enriched_response_with_metadata({}, None, std::time::Duration::from_millis(100)) }}",
function_name_camel,
code
);
println!(
"fn {}() -> String {{ response_helpers::get_enriched_response_with_metadata({}, None, std::time::Duration::from_millis(100)) }}",
function_name_pascal,
code
);
}
}
}
)*
};
}
#[test]
fn test_generated_functions_success() {
let response = crate::ResponsesSuccessCodes::Ok;
let (code, description): (u16, &str) = response.into();
assert_eq!(code, 200);
assert_eq!(
description,
"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"
);
}
#[cfg(test)]
mod tests {
use crate::helpers::response_functions::ResponseFunctions;
use std::io::{stdout, Write};
use std::sync::{Arc, Mutex};
#[test]
fn test_generate_responses_with_metadata() {
let buffer = Arc::new(Mutex::new(Vec::new()));
let buffer_clone = Arc::clone(&buffer);
let original_stdout = stdout();
let mut locked_stdout = original_stdout.lock();
let mut locked_buffer = buffer_clone.lock().unwrap();
let _ = write!(&mut locked_buffer, ""); let _ = write!(&mut locked_stdout, ""); crate::ResponsesSuccessCodes::generate_responses_with_metadata();
let output = String::from_utf8(buffer.lock().unwrap().clone()).expect("Invalid UTF-8");
assert!(output.contains("fn ok() -> String"));
assert!(output.contains("response_helpers::get_enriched_response_with_metadata(200"));
}
#[test]
fn test_function_presence() {
crate::ResponsesSuccessCodes::generate_responses_with_metadata();
}
}