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}