Skip to main content

resuma_macros/
lib.rs

1//! Resuma procedural macros.
2//!
3//! Re-exported by the [`resuma`](https://docs.rs/resuma) crate. Typical surface:
4//!
5//! | Macro | Role |
6//! |-------|------|
7//! | [`view!`] | JSX-like templates → [`View`](https://docs.rs/resuma/latest/resuma/enum.View.html) |
8//! | [`#[component]`](component) | Resumable component + props builder (lazy handler boundary) |
9//! | [`#[server]`](server) | Async RPC at `POST /_resuma/action/:name` |
10//! | [`#[data]`](data) | Concise typed DTO/model helper |
11//! | [`computed!`](computed) | Client-replayable derived signal (rs2js) |
12//! | [`effect!`](effect) | Client-replayable side effect (rs2js) |
13//! | [`debounce!`](debounce) | Debounced client reaction |
14//! | [`#[island]`](island) | Optional heavy lazy boundary (`load = "visible"`) |
15//! | [`js!`](js) | Raw JavaScript handler escape hatch |
16
17mod component_macro;
18mod computed_macro;
19mod data_macro;
20mod debounce_macro;
21mod effect_macro;
22mod island_macro;
23mod js_macro;
24mod layout_macro;
25mod load_macro;
26mod middleware_macro;
27mod rs2js;
28mod server_macro;
29mod submit_macro;
30mod view_macro;
31
32use proc_macro::TokenStream;
33
34/// `view!` — JSX-like template macro.
35#[proc_macro]
36pub fn view(input: TokenStream) -> TokenStream {
37    view_macro::expand(input.into()).into()
38}
39
40/// `#[component]` — resumable component with generated props builder.
41///
42/// Wraps output in a lazy handler boundary; event handlers register under
43/// `/_resuma/handler/{ComponentName}.js`. For heavy optional lazy bundles, see [`island`].
44#[proc_macro_attribute]
45pub fn component(args: TokenStream, input: TokenStream) -> TokenStream {
46    component_macro::expand(args.into(), input.into()).into()
47}
48
49/// `#[server]` — exposes an async fn as a server action.
50#[proc_macro_attribute]
51pub fn server(args: TokenStream, input: TokenStream) -> TokenStream {
52    server_macro::expand(args.into(), input.into()).into()
53}
54
55/// `#[data]` — concise DTO/model helper for Resuma data structs and enums.
56#[proc_macro_attribute]
57pub fn data(args: TokenStream, input: TokenStream) -> TokenStream {
58    data_macro::expand(args.into(), input.into()).into()
59}
60
61/// `#[island]` — optional interactive boundary for heavy or visibility-gated JS.
62///
63/// Most UI only needs [`component`]. Use islands for large client bundles,
64/// `#[island(load = "visible")]`, or dev HMR refresh via `GET /_resuma/island/:instance`.
65#[proc_macro_attribute]
66pub fn island(args: TokenStream, input: TokenStream) -> TokenStream {
67    island_macro::expand(args.into(), input.into()).into()
68}
69
70/// `#[load]` — Resuma Flow server data loader.
71#[proc_macro_attribute]
72pub fn load(args: TokenStream, input: TokenStream) -> TokenStream {
73    load_macro::expand(args.into(), input.into()).into()
74}
75
76/// `#[submit]` — Resuma Flow form submission handler.
77#[proc_macro_attribute]
78pub fn submit(args: TokenStream, input: TokenStream) -> TokenStream {
79    submit_macro::expand(args.into(), input.into()).into()
80}
81
82/// `#[layout]` — Resuma Flow layout wrapper.
83#[proc_macro_attribute]
84pub fn layout(args: TokenStream, input: TokenStream) -> TokenStream {
85    layout_macro::expand(args.into(), input.into()).into()
86}
87
88/// `#[middleware]` — Resuma Flow request middleware.
89#[proc_macro_attribute]
90pub fn middleware(args: TokenStream, input: TokenStream) -> TokenStream {
91    middleware_macro::expand(args.into(), input.into()).into()
92}
93
94/// `js!` — raw JavaScript escape hatch for event handlers.
95#[proc_macro]
96pub fn js(input: TokenStream) -> TokenStream {
97    js_macro::expand(input.into()).into()
98}
99
100/// `computed!([deps…], move || …)` — derived signal with client replay (rs2js-translated).
101///
102/// Runs during SSR and replays in the browser when dependencies change.
103/// For SSR-only derived state, use [`use_computed`](https://docs.rs/resuma/latest/resuma/fn.use_computed.html) instead.
104#[proc_macro]
105pub fn computed(input: TokenStream) -> TokenStream {
106    computed_macro::expand(input.into()).into()
107}
108
109/// `effect!([signals…], move || { … })` — client-replayable side effect (rs2js).
110#[proc_macro]
111pub fn effect(input: TokenStream) -> TokenStream {
112    effect_macro::expand(input.into()).into()
113}
114
115/// `debounce!([deps…], ms, move || …)` — debounced client reaction (rs2js-translated).
116///
117/// ```ignore
118/// debounce!([search], 300, move || { /* runs after search settles */ });
119/// ```
120#[proc_macro]
121pub fn debounce(input: TokenStream) -> TokenStream {
122    debounce_macro::expand(input.into()).into()
123}