use proc_macro2::TokenStream;
use quote::quote;
use vespera_core::route::HttpMethod;
pub fn http_method_to_token_stream(method: HttpMethod) -> TokenStream {
match method {
HttpMethod::Get => quote! { vespera::axum::routing::get },
HttpMethod::Post => quote! { vespera::axum::routing::post },
HttpMethod::Put => quote! { vespera::axum::routing::put },
HttpMethod::Patch => quote! { vespera::axum::routing::patch },
HttpMethod::Delete => quote! { vespera::axum::routing::delete },
HttpMethod::Head => quote! { vespera::axum::routing::head },
HttpMethod::Options => quote! { vespera::axum::routing::options },
HttpMethod::Trace => quote! { vespera::axum::routing::trace },
}
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
#[case(HttpMethod::Get, "get")]
#[case(HttpMethod::Post, "post")]
#[case(HttpMethod::Put, "put")]
#[case(HttpMethod::Patch, "patch")]
#[case(HttpMethod::Delete, "delete")]
#[case(HttpMethod::Head, "head")]
#[case(HttpMethod::Options, "options")]
#[case(HttpMethod::Trace, "trace")]
fn test_http_method_to_token_stream(
#[case] method: HttpMethod,
#[case] expected_method_name: &str,
) {
let result = http_method_to_token_stream(method);
let code = result.to_string();
assert!(
code.contains(expected_method_name),
"Code should contain method name: {}, got: {}",
expected_method_name,
code
);
assert!(
code.contains("routing"),
"Code should contain 'routing', got: {}",
code
);
assert!(
code.contains("axum"),
"Code should contain 'axum', got: {}",
code
);
assert!(
code.contains("vespera"),
"Code should contain 'vespera', got: {}",
code
);
}
#[test]
fn test_http_method_to_token_stream_all_methods() {
let methods = vec![
HttpMethod::Get,
HttpMethod::Post,
HttpMethod::Put,
HttpMethod::Patch,
HttpMethod::Delete,
HttpMethod::Head,
HttpMethod::Options,
HttpMethod::Trace,
];
for method in methods {
let result = http_method_to_token_stream(method.clone());
let code = result.to_string();
assert!(
!code.is_empty(),
"TokenStream should not be empty for {:?}",
method
);
assert!(
code.contains("routing"),
"TokenStream should contain 'routing' for {:?}, got: {}",
method,
code
);
}
}
}