daedalus_macros/lib.rs
1#![allow(
2 clippy::collapsible_if,
3 clippy::redundant_pattern_matching,
4 clippy::doc_overindented_list_items
5)]
6
7mod config_derive;
8mod gpu_state_derive;
9mod helpers;
10mod node_fn_impl;
11mod node_handler_impl;
12mod shader_bindings;
13
14/// Define a node handler without generating registry metadata.
15///
16/// ```ignore
17/// use daedalus_macros::node_handler;
18///
19/// #[node_handler]
20/// fn handler(
21/// _node: &daedalus_runtime::RuntimeNode,
22/// _ctx: &daedalus_runtime::state::ExecutionContext,
23/// _io: &mut daedalus_runtime::io::NodeIo,
24/// ) -> Result<(), daedalus_runtime::executor::NodeError> {
25/// Ok(())
26/// }
27/// ```
28#[proc_macro_attribute]
29pub fn node_handler(
30 args: proc_macro::TokenStream,
31 item: proc_macro::TokenStream,
32) -> proc_macro::TokenStream {
33 node_handler_impl::node_handler(args, item)
34}
35
36/// Define a node with descriptor + handler generation.
37///
38/// ```ignore
39/// use daedalus_macros::node;
40/// use daedalus_runtime::NodeError;
41///
42/// #[node(id = "demo:noop", inputs("in"), outputs("out"))]
43/// fn noop(value: i64) -> Result<i64, NodeError> {
44/// Ok(value)
45/// }
46/// ```
47#[proc_macro_attribute]
48pub fn node(
49 args: proc_macro::TokenStream,
50 item: proc_macro::TokenStream,
51) -> proc_macro::TokenStream {
52 node_fn_impl::node(args, item)
53}
54
55/// Derive `NodeConfig` for structured config inputs.
56///
57/// ```ignore
58/// use daedalus_macros::NodeConfig;
59///
60/// #[derive(NodeConfig)]
61/// struct BlurConfig {
62/// #[port(default = 3, min = 1, max = 31)]
63/// radius: i32,
64/// }
65/// ```
66#[proc_macro_derive(NodeConfig, attributes(port, validate))]
67pub fn node_config(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
68 config_derive::node_config(item)
69}
70
71/// Derive WGSL bindings for a GPU shader.
72///
73/// ```ignore
74/// use daedalus_macros::GpuBindings;
75///
76/// #[derive(GpuBindings)]
77/// #[gpu(spec(src = "shader.wgsl", entry = "main"))]
78/// struct Params {
79/// #[gpu(binding = 0)]
80/// data: Vec<u32>,
81/// }
82/// ```
83#[proc_macro_derive(GpuBindings, attributes(gpu))]
84pub fn gpu_bindings(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
85 shader_bindings::gpu_bindings(item)
86}
87
88/// Derive GPU state buffer metadata for a POD type.
89///
90/// ```ignore
91/// use daedalus_macros::GpuStateful;
92///
93/// #[derive(GpuStateful)]
94/// struct State {
95/// counter: u32,
96/// }
97/// ```
98#[proc_macro_derive(GpuStateful, attributes(gpu_state))]
99pub fn gpu_stateful(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
100 gpu_state_derive::gpu_stateful(item)
101}