1extern crate proc_macro;
2
3mod child;
4mod children;
5mod element;
6mod element_attribute;
7mod element_attributes;
8mod function_component;
9mod tags;
10
11use element::Element;
12use proc_macro::TokenStream;
13use proc_macro_error::proc_macro_error;
14use quote::quote;
15use syn::parse_macro_input;
16
17#[proc_macro]
18#[proc_macro_error]
19pub fn html(input: TokenStream) -> TokenStream {
20 let el = proc_macro2::TokenStream::from(rsx(input));
21 let result = quote! { ::tide_jsx::Render::render(#el) };
22 TokenStream::from(result)
23}
24
25#[proc_macro]
27#[proc_macro_error]
28pub fn rsx(input: TokenStream) -> TokenStream {
29 let el = parse_macro_input!(input as Element);
30 let result = quote! { #el };
31 TokenStream::from(result)
32}
33
34#[proc_macro]
35#[proc_macro_error]
36pub fn view(input: TokenStream) -> TokenStream {
37 let el = parse_macro_input!(input as Element);
38 let result = quote! {
39 Ok(::tide::Response::builder(tide::http::StatusCode::Ok)
40 .content_type(::tide::http::mime::HTML)
41 .body(::tide_jsx::Render::render(#el))
42 .build())
43 };
44 TokenStream::from(result)
45}
46
47#[proc_macro_attribute]
48#[proc_macro_error]
49pub fn component(_attr: TokenStream, item: TokenStream) -> TokenStream {
50 let f = parse_macro_input!(item as syn::ItemFn);
51 function_component::create_function_component(f)
52}