Skip to main content

loomx_macros/
lib.rs

1//! loomx-macros
2//!
3//! Macro helpers for defining and registering loomx components.
4//!
5//! This crate provides `register_component!`, which submits a component into the
6//! global registry using `inventory`.
7//!
8
9#[macro_export]
10/// Register a component type in the global registry.
11///
12/// Components must implement [`loomx::Component`]. Registration is compile-time via `inventory`.
13///
14/// # Example
15/// ```no_run
16/// # use loomx::{Component, register_component};
17/// # use askama::Template;
18/// # use serde::Deserialize;
19/// #[derive(Template, Deserialize)]
20/// # #[template(source = "<div></div>", ext = "html")]
21/// struct MyComponent { }
22/// impl Component for MyComponent { const NAME: &'static str = "my_component"; }
23/// register_component!(MyComponent);
24/// ```
25macro_rules! register_component {
26    ($ty:ty) => {
27        $crate::__private::inventory::submit! {
28            $crate::__private::ComponentDecl {
29                name: <$ty as $crate::__private::Component>::NAME,
30                render_from_json: |props| {
31                    $crate::__private::tracing::debug!(
32                        component = <$ty as $crate::__private::Component>::NAME,
33                        "rendering component"
34                    );
35                    $crate::__private::render_typed::<$ty>(props)
36                },
37            }
38        }
39    };
40}
41
42pub mod __private {
43    pub use loomx_core::{
44        Component,
45        ComponentDecl,
46        LoomxError,
47        render_typed,
48        inventory,
49        tracing,
50    };
51}