pulse-schema-derive 0.1.0-alpha.1

Rust proc-macro attributes for generating Pulse Schema Language (PSL) from native Rust types
Documentation
use proc_macro::TokenStream;
use syn::{parse_macro_input, DeriveInput};

mod emit;

/// Derives `pulse_type` and emits canonical PSL representing the struct.
#[proc_macro_attribute]
pub fn pulse_type(_args: TokenStream, input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    
    // We will parse the struct and extract attributes into a PSL ast::MessageDef
    // and then write it to `schema.psl`.
    emit::write_psl_type(&input);
    
    // Output the original token stream unmodified (so Rust still sees the struct)
    TokenStream::from(quote::quote! { #input })
}

/// Derives `pulse_enum` and emits canonical PSL representing the enum.
#[proc_macro_attribute]
pub fn pulse_enum(_args: TokenStream, input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    emit::write_psl_enum(&input);
    TokenStream::from(quote::quote! { #input })
}

/// Derives `pulse_error` and emits canonical PSL representing error types.
#[proc_macro_attribute]
pub fn pulse_error(_args: TokenStream, input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    emit::write_psl_error(&input);
    TokenStream::from(quote::quote! { #input })
}

/// Derives `pulse_service` for a trait.
#[proc_macro_attribute]
pub fn pulse_service(_args: TokenStream, input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as syn::ItemTrait);
    emit::write_psl_service(&input);
    TokenStream::from(quote::quote! { #input })
}

#[proc_macro_attribute]
pub fn collection(_args: TokenStream, input: TokenStream) -> TokenStream { input }

#[proc_macro_attribute]
pub fn index(_args: TokenStream, input: TokenStream) -> TokenStream { input }

#[proc_macro_attribute]
pub fn unique(_args: TokenStream, input: TokenStream) -> TokenStream { input }

#[proc_macro_attribute]
pub fn auth(_args: TokenStream, input: TokenStream) -> TokenStream { input }