Skip to main content

medi_rs_macros/
lib.rs

1//! Derive macros for `medi-rs`.
2//!
3//! These macros generate command metadata, handler invokers, and module
4//! manifests for the main `medi-rs` crate.
5
6mod command;
7mod composition;
8mod generate;
9mod handler;
10mod manifest;
11mod task;
12
13use command::derive_medi_command_inner;
14use composition::finalize_composition_inner;
15use handler::medi_handler_inner;
16use manifest::medi_module_inner;
17use task::medi_task_inner;
18
19/// Derive static command metadata for a command or query type.
20///
21/// Use `#[medi_command(return_type = Type)]` to specify the response type. If
22/// omitted, the command response type is `()`.
23#[proc_macro_derive(MediCommand, attributes(medi_command))]
24pub fn derive_medi_command(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
25    derive_medi_command_inner(input)
26}
27
28/// Declare a reusable mediator registration manifest owned by a Rust module.
29///
30/// A manifest is consumed by the `medi_rs::mediator!` macro.
31#[proc_macro]
32pub fn medi_module(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
33    medi_module_inner(input)
34}
35
36/// Generate a typed static-dispatch invoker for an async handler function.
37///
38/// Use `#[medi_handler(decorators = [logging, validate])]` to wrap an
39/// invocation with middleware functions that receive the command and a
40/// continuation.
41#[proc_macro_attribute]
42pub fn medi_handler(attribute: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
43    medi_handler_inner(attribute, input)
44}
45
46/// Generate a runtime task invoker with typed mediator resource injection.
47///
48/// The selected medi-rs runtime starts registered tasks. An optional first
49/// `&AppMediator` parameter provides mediator access; remaining value parameters
50/// are resources.
51#[proc_macro_attribute]
52pub fn medi_task(attribute: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
53    medi_task_inner(attribute, input)
54}
55
56/// Internal endpoint that validates a collected manifest graph and generates a mediator.
57#[doc(hidden)]
58#[proc_macro]
59pub fn __medi_rs_finalize_composition(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
60    finalize_composition_inner(input)
61}