Skip to main content

pulse_schema_derive/
lib.rs

1use proc_macro::TokenStream;
2use syn::{parse_macro_input, DeriveInput};
3
4mod emit;
5
6/// Derives `pulse_type` and emits canonical PSL representing the struct.
7#[proc_macro_attribute]
8pub fn pulse_type(_args: TokenStream, input: TokenStream) -> TokenStream {
9    let input = parse_macro_input!(input as DeriveInput);
10    
11    // We will parse the struct and extract attributes into a PSL ast::MessageDef
12    // and then write it to `schema.psl`.
13    emit::write_psl_type(&input);
14    
15    // Output the original token stream unmodified (so Rust still sees the struct)
16    TokenStream::from(quote::quote! { #input })
17}
18
19/// Derives `pulse_enum` and emits canonical PSL representing the enum.
20#[proc_macro_attribute]
21pub fn pulse_enum(_args: TokenStream, input: TokenStream) -> TokenStream {
22    let input = parse_macro_input!(input as DeriveInput);
23    emit::write_psl_enum(&input);
24    TokenStream::from(quote::quote! { #input })
25}
26
27/// Derives `pulse_error` and emits canonical PSL representing error types.
28#[proc_macro_attribute]
29pub fn pulse_error(_args: TokenStream, input: TokenStream) -> TokenStream {
30    let input = parse_macro_input!(input as DeriveInput);
31    emit::write_psl_error(&input);
32    TokenStream::from(quote::quote! { #input })
33}
34
35/// Derives `pulse_service` for a trait.
36#[proc_macro_attribute]
37pub fn pulse_service(_args: TokenStream, input: TokenStream) -> TokenStream {
38    let input = parse_macro_input!(input as syn::ItemTrait);
39    emit::write_psl_service(&input);
40    TokenStream::from(quote::quote! { #input })
41}
42
43#[proc_macro_attribute]
44pub fn collection(_args: TokenStream, input: TokenStream) -> TokenStream { input }
45
46#[proc_macro_attribute]
47pub fn index(_args: TokenStream, input: TokenStream) -> TokenStream { input }
48
49#[proc_macro_attribute]
50pub fn unique(_args: TokenStream, input: TokenStream) -> TokenStream { input }
51
52#[proc_macro_attribute]
53pub fn auth(_args: TokenStream, input: TokenStream) -> TokenStream { input }