use proc_macro::TokenStream;
mod component_doc;
mod routes;
mod routes_extract;
mod write_css_vars;
use quote::quote;
use syn::parse::{Parse, ParseStream};
use syn::{parse_macro_input, Token};
#[proc_macro_attribute]
pub fn component_doc(attr: TokenStream, input: TokenStream) -> TokenStream {
component_doc::expand_component_doc(attr, input)
}
struct RouteComponents {
components: Vec<syn::Ident>,
}
impl Parse for RouteComponents {
fn parse(input: ParseStream) -> syn::Result<Self> {
let mut components = Vec::new();
while !input.is_empty() {
let ident: syn::Ident = input.parse()?;
components.push(ident);
if input.peek(Token![,]) {
input.parse::<Token![,]>()?;
} else {
break;
}
}
Ok(RouteComponents { components })
}
}
#[proc_macro]
pub fn orbital_routes(input: TokenStream) -> TokenStream {
let RouteComponents { components } = parse_macro_input!(input);
let route_components = components.iter().map(|ident| {
quote! { <#ident /> }
});
quote! { #(#route_components)* }.into()
}
#[proc_macro_attribute]
pub fn orbital_routes_extract(attr: TokenStream, input: TokenStream) -> TokenStream {
routes_extract::expand_routes(attr, input)
}
#[proc_macro_derive(WriteCSSVars)]
pub fn write_css_vars(input: TokenStream) -> TokenStream {
let input = syn::parse_macro_input!(input as syn::DeriveInput);
write_css_vars::expand_write_css_vars(input).into()
}