use proc_macro2::TokenStream;
use quote::quote;
use crate::diagnostic::{MacroError, MacroErrorCode, MacroResult};
pub fn redirect(input: TokenStream) -> MacroResult {
if input.is_empty() {
return Err(MacroError::new(
MacroErrorCode::ArcM001,
proc_macro2::Span::call_site(),
"redirect! requires a route expression, e.g. `redirect!(route::dashboard())`",
));
}
Ok(quote! {
::arcature::redirect().to(#input)
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wraps_route_helper_call() {
let expanded = redirect(quote! { route::links::show(link.id) }).unwrap();
let s = expanded.to_string();
assert!(s.contains(":: arcature :: redirect ()"), "got: {s}");
assert!(s.contains("route :: links :: show"), "got: {s}");
}
#[test]
fn wraps_simple_path() {
let expanded = redirect(quote! { route::dashboard() }).unwrap();
assert!(expanded.to_string().contains("dashboard"));
}
#[test]
fn rejects_empty_input() {
let err = redirect(TokenStream::new()).unwrap_err();
assert_eq!(err.code(), MacroErrorCode::ArcM001);
}
}