tide_jsx_impl/
lib.rs

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/// Generate a renderable component tree, before rendering it
26#[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}