1mod case;
2mod component_data;
3mod component_to_tokens;
4mod custom_element;
5mod err;
6mod props_data;
7mod props_to_tokens;
8mod rsx_data;
9mod rsx_to_tokens;
10
11use proc_macro::TokenStream;
12use quote::ToTokens;
13use syn::parse_macro_input;
14
15#[proc_macro_attribute]
16pub fn component(args: TokenStream, input: TokenStream) -> TokenStream {
17 use component_data::*;
18 let attr_args = parse_macro_input!(args as syn::AttributeArgs);
19 let input_fn = parse_macro_input!(input as syn::ItemFn);
20
21 let comp = ComponentDefinition::from_attrs_and_fn(attr_args, input_fn);
22
23 comp.into_ts().into()
24}
25
26#[proc_macro]
27pub fn snake_to_camel(input: TokenStream) -> TokenStream {
28 let lit = parse_macro_input!(input as syn::LitStr);
29 let lit = case::snake_to_camel_lit_str(&lit.value(), lit.span());
30 lit.to_token_stream().into()
31}
32
33#[proc_macro]
34pub fn ident_snake_to_camel(input: TokenStream) -> TokenStream {
35 let ident = parse_macro_input!(input as syn::Ident);
36 let lit = case::snake_to_camel_lit_str(&ident.to_string(), ident.span());
37 lit.to_token_stream().into()
38}
39
40#[proc_macro]
41pub fn rsx(input: TokenStream) -> TokenStream {
42 let value = parse_macro_input!(input as rsx_data::RsxChild);
43
44 value.to_token_stream().into()
45}
46
47#[proc_macro]
48pub fn def_props(input: TokenStream) -> TokenStream {
49 use props_data::PropsDefinitionWithOptions;
50 let value = parse_macro_input!(input with PropsDefinitionWithOptions::parse_proc_macro_input);
51 let mut ts = proc_macro2::TokenStream::new();
52 value.into_tokens(&mut ts);
53 ts.into()
54}
55
56#[proc_macro_attribute]
57pub fn custom_element(args: TokenStream, input: TokenStream) -> TokenStream {
58 use custom_element::*;
59
60 match CustomElementDefinition::parse_input(args, input) {
61 Ok(v) => v.into_ts().into(),
62 Err(error) => error.write_errors().into(),
63 }
64}