auric-derive 0.1.2-rc.2

Derive module for the `auric` MVC SPA framework
Documentation
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");
    }
}