use proc_macro::TokenStream;
use proc_macro2::{Literal, Span};
use quote::quote;
use syn::{DeriveInput, Ident, parse_macro_input};
pub fn generate(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let struct_name = &input.ident;
let model_name = Ident::new(&format!("{}Model", struct_name), Span::call_site());
let route_name = Literal::string(&route_name(struct_name.to_string().as_str()));
let tokens = quote! {
#[::auric_runtime::async_trait::async_trait]
impl ::auric_runtime::routing::Route<#model_name> for #struct_name {
fn name(&self) -> &'static str {
#route_name
}
}
};
tokens.into()
}
fn route_name(struct_name: &str) -> String {
let s = struct_name.strip_suffix("Route").unwrap();
let s = change_case::snake_case(s);
s.replace("_", ".")
}
#[cfg(test)]
mod tests {
use super::route_name;
#[test]
fn can_derive_route_name_from_struct_name() {
assert_eq!(route_name("ApplicationRoute"), "application");
assert_eq!(route_name("IndexRoute"), "index");
assert_eq!(route_name("CustomerIndexRoute"), "customer.index");
assert_eq!(route_name("CustomerOrdersRoute"), "customer.orders");
}
}