arcature-macros 0.1.0

Proc-macro crate for Arcature: #[model], #[request], #[controller], #[derive(Job)], #[derive(Event)].
Documentation
//! `#[derive(Event)]` — a typed in-process event for the `Dispatcher`.
//!
//! Emits `impl DxComponent { const NAME = <type name> }` and `impl Event {}`.
//!
//! One file, one macro: this is the entirety of the `#[derive(Event)]`
//! expansion.

use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use syn::DeriveInput;

/// The `#[derive(Event)]` derive macro entry point.
pub fn derive_event(input: TokenStream) -> TokenStream {
    let input = syn::parse_macro_input!(input as DeriveInput);
    expand_event(&input).into()
}

fn expand_event(input: &DeriveInput) -> TokenStream2 {
    let ident = &input.ident;
    let name = ident.to_string();
    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();

    quote! {
        impl #impl_generics ::arcature::DxComponent for #ident #ty_generics #where_clause {
            const NAME: &'static str = #name;
        }
        impl #impl_generics ::arcature::Event for #ident #ty_generics #where_clause {}
    }
}