ratatui_kit_macros/
lib.rs

1use element::ElementOrAdapter;
2use proc_macro::TokenStream;
3use props::ParsedProps;
4use quote::ToTokens;
5use syn::DeriveInput;
6
7use crate::with_layout_style::impl_layout_style;
8
9mod adapter;
10mod component;
11mod element;
12mod props;
13#[cfg(feature = "router")]
14mod router;
15#[cfg(feature = "store")]
16mod store;
17mod utils;
18mod with_layout_style;
19
20#[proc_macro_derive(Props, attributes(layout))]
21pub fn derive_props(item: TokenStream) -> TokenStream {
22    let props = syn::parse_macro_input!(item as ParsedProps);
23    props.to_token_stream().into()
24}
25
26#[proc_macro]
27pub fn element(input: TokenStream) -> TokenStream {
28    let element = syn::parse_macro_input!(input as ElementOrAdapter);
29    element.to_token_stream().into()
30}
31
32#[proc_macro_attribute]
33pub fn component(_attr: TokenStream, item: TokenStream) -> TokenStream {
34    let component = syn::parse_macro_input!(item as component::ParsedComponent);
35    component.to_token_stream().into()
36}
37
38#[cfg(feature = "router")]
39#[proc_macro]
40pub fn routes(input: TokenStream) -> TokenStream {
41    let routes = syn::parse_macro_input!(input as router::Routes);
42    routes.to_token_stream().into()
43}
44
45#[cfg(feature = "store")]
46#[proc_macro]
47pub fn use_stores(input: TokenStream) -> TokenStream {
48    let stores = syn::parse_macro_input!(input as store::UseStores);
49    stores.to_token_stream().into()
50}
51
52#[cfg(feature = "store")]
53#[proc_macro_derive(Store)]
54pub fn derive_store(item: TokenStream) -> TokenStream {
55    let store = syn::parse_macro_input!(item as store::Store);
56    store.to_token_stream().into()
57}
58
59#[proc_macro_attribute]
60pub fn with_layout_style(attr: TokenStream, item: TokenStream) -> TokenStream {
61    let layout_style = syn::parse_macro_input!(attr as with_layout_style::ParsedLayoutStyle);
62    let props = syn::parse_macro_input!(item as DeriveInput);
63    impl_layout_style(&layout_style, props).into()
64}