mod markdown; use crate::markdown::parse_markdown; use proc_macro2::{Ident, Span}; use quote::quote; use syn::ItemFn; #[proc_macro] pub fn include_md(_token_stream: proc_macro::TokenStream) -> proc_macro::TokenStream { let file_list = vec![("UploadMdPage", include_str!("../docs/upload/mod.md"))]; let mut fn_list = vec![]; for (fn_name, file_str) in file_list { let fn_name = Ident::new(fn_name, Span::call_site()); let (body, demos) = match parse_markdown(file_str) { Ok(body) => body, Err(err) => { return quote!(compile_error!(#err)).into(); } }; let demos: Vec = demos .into_iter() .enumerate() .map(|(index, demo)| { format!( "#[component] fn Demo{}() -> impl IntoView {{ {} }}", index + 1, demo ) }) .map(|demo| syn::parse_str::(&demo).unwrap()) .collect(); fn_list.push(quote! { #[component] pub fn #fn_name() -> impl IntoView { #(#demos)* view! {
#body
} } }); } quote! { #(#fn_list)* } .into() }