Skip to main content

resuma_macros/
lib.rs

1//! Resuma procedural macros.
2//!
3//! These macros are the surface area Resuma exposes to user code:
4//!
5//!   * [`view!`]        — JSX-like template syntax that builds a `View` tree.
6//!   * [`#[component]`] — turns a function into a Resuma component.
7//!   * [`#[server]`]    — exposes an async fn as a server action / RPC.
8//!   * [`#[island]`]    — marks an interactive island (its handlers ship to JS).
9//!   * [`js!`]          — escape hatch for raw JavaScript handler bodies.
10
11mod component_macro;
12mod computed_macro;
13mod debounce_macro;
14mod effect_macro;
15mod island_macro;
16mod js_macro;
17mod layout_macro;
18mod load_macro;
19mod middleware_macro;
20mod rs2js;
21mod server_macro;
22mod submit_macro;
23mod view_macro;
24
25use proc_macro::TokenStream;
26
27/// `view!` — JSX-like template macro.
28#[proc_macro]
29pub fn view(input: TokenStream) -> TokenStream {
30    view_macro::expand(input.into()).into()
31}
32
33/// `#[component]` — registers a function as a Resuma component.
34#[proc_macro_attribute]
35pub fn component(args: TokenStream, input: TokenStream) -> TokenStream {
36    component_macro::expand(args.into(), input.into()).into()
37}
38
39/// `#[server]` — exposes an async fn as a server action.
40#[proc_macro_attribute]
41pub fn server(args: TokenStream, input: TokenStream) -> TokenStream {
42    server_macro::expand(args.into(), input.into()).into()
43}
44
45/// `#[island]` — marks a component as an interactive island.
46#[proc_macro_attribute]
47pub fn island(args: TokenStream, input: TokenStream) -> TokenStream {
48    island_macro::expand(args.into(), input.into()).into()
49}
50
51/// `#[load]` — Resuma Flow server data loader.
52#[proc_macro_attribute]
53pub fn load(args: TokenStream, input: TokenStream) -> TokenStream {
54    load_macro::expand(args.into(), input.into()).into()
55}
56
57/// `#[submit]` — Resuma Flow form submission handler.
58#[proc_macro_attribute]
59pub fn submit(args: TokenStream, input: TokenStream) -> TokenStream {
60    submit_macro::expand(args.into(), input.into()).into()
61}
62
63/// `#[layout]` — Resuma Flow layout wrapper.
64#[proc_macro_attribute]
65pub fn layout(args: TokenStream, input: TokenStream) -> TokenStream {
66    layout_macro::expand(args.into(), input.into()).into()
67}
68
69/// `#[middleware]` — Resuma Flow request middleware.
70#[proc_macro_attribute]
71pub fn middleware(args: TokenStream, input: TokenStream) -> TokenStream {
72    middleware_macro::expand(args.into(), input.into()).into()
73}
74
75/// `js!` — raw JavaScript escape hatch for event handlers.
76#[proc_macro]
77pub fn js(input: TokenStream) -> TokenStream {
78    js_macro::expand(input.into()).into()
79}
80
81/// `computed!` / `use_computed!` — client-replayable derived signal (rs2js-translated).
82#[proc_macro]
83pub fn computed(input: TokenStream) -> TokenStream {
84    computed_macro::expand(input.into()).into()
85}
86
87/// `effect!([signals…], move || { … })` — client-replayable side effect (rs2js).
88#[proc_macro]
89pub fn effect(input: TokenStream) -> TokenStream {
90    effect_macro::expand(input.into()).into()
91}
92
93/// `debounce!` — debounced client reaction to a signal.
94///
95/// ```ignore
96/// debounce!(query, 300, move |q| filter.set(q));
97/// ```
98#[proc_macro]
99pub fn debounce(input: TokenStream) -> TokenStream {
100    debounce_macro::expand(input.into()).into()
101}