|
@@ -1,3 +1,4 @@
|
|
|
+use proc_macro::TokenStream;
|
|
|
use quote::{quote, quote_spanned, ToTokens};
|
|
|
use syn::spanned::Spanned;
|
|
|
use syn::{
|
|
@@ -9,12 +10,24 @@ use syn::{
|
|
|
};
|
|
|
|
|
|
mod fc;
|
|
|
+mod htm;
|
|
|
mod ifmt;
|
|
|
|
|
|
+/// The html! macro makes it easy for developers to write jsx-style markup in their components.
|
|
|
+/// We aim to keep functional parity with html templates.
|
|
|
+#[proc_macro]
|
|
|
+pub fn html(s: TokenStream) -> TokenStream {
|
|
|
+ let html: htm::HtmlRender = match syn::parse(s) {
|
|
|
+ Ok(s) => s,
|
|
|
+ Err(e) => return e.to_compile_error().into(),
|
|
|
+ };
|
|
|
+ html.to_token_stream().into()
|
|
|
+}
|
|
|
+
|
|
|
/// Label a function or static closure as a functional component.
|
|
|
/// This macro reduces the need to create a separate properties struct.
|
|
|
#[proc_macro_attribute]
|
|
|
-pub fn fc(attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
|
+pub fn fc(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
use fc::{function_component_impl, FunctionComponent};
|
|
|
|
|
|
let item = parse_macro_input!(item as FunctionComponent);
|
|
@@ -28,7 +41,7 @@ pub fn fc(attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_
|
|
|
}
|
|
|
|
|
|
#[proc_macro]
|
|
|
-pub fn format_args_f(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
|
+pub fn format_args_f(input: TokenStream) -> TokenStream {
|
|
|
use ifmt::*;
|
|
|
|
|
|
let item = parse_macro_input!(input as IfmtInput);
|