mod export;
mod test_guide;
mod uri;
mod uri_parsing;
pub mod typed_stream;
use devise::Result;
use proc_macro2::TokenStream;
use syn::spanned::Spanned;
use syn::{parse::Parser, punctuated::Punctuated, Path, Token};
fn struct_maker_vec(
input: proc_macro::TokenStream,
ty: TokenStream,
map: impl Fn(TokenStream) -> TokenStream,
) -> Result<TokenStream> {
use crate::exports::_Vec;
let paths = <Punctuated<Path, Token![,]>>::parse_terminated.parse(input)?;
let exprs = paths.iter().map(|path| {
let expr = map(quote_spanned!(path.span() => ___struct));
quote_spanned!(path.span() => {
let ___struct = #path {};
let ___item: #ty = #expr;
___item
})
});
Ok(quote!({
let ___vec: #_Vec<#ty> = vec![#(#exprs),*];
___vec
}))
}
pub fn routes_macro(input: proc_macro::TokenStream) -> TokenStream {
struct_maker_vec(input, quote!(::rkt::Route), |e| quote!(#e.into_route()))
.unwrap_or_else(|diag| diag.emit_as_expr_tokens())
}
pub fn catchers_macro(input: proc_macro::TokenStream) -> TokenStream {
struct_maker_vec(
input,
quote!(::rkt::Catcher),
|e| quote!(#e.into_catcher()),
)
.unwrap_or_else(|diag| diag.emit_as_expr_tokens())
}
pub fn uri_macro(input: proc_macro::TokenStream) -> TokenStream {
uri::_uri_macro(input.into()).unwrap_or_else(|diag| {
diag.emit_as_expr_tokens_or(quote! {
rkt::http::uri::Origin::root()
})
})
}
pub fn uri_internal_macro(input: proc_macro::TokenStream) -> TokenStream {
uri::_uri_internal_macro(input.into()).unwrap_or_else(|diag| {
diag.emit_as_expr_tokens_or(quote! {
rkt::http::uri::Origin::root()
})
})
}
pub fn guide_tests_internal(input: proc_macro::TokenStream) -> TokenStream {
test_guide::_macro(input).unwrap_or_else(|diag| diag.emit_as_item_tokens())
}
pub fn export_internal(input: proc_macro::TokenStream) -> TokenStream {
export::_macro(input).unwrap_or_else(|diag| diag.emit_as_item_tokens())
}
pub fn typed_stream(input: proc_macro::TokenStream) -> TokenStream {
typed_stream::_macro(input).unwrap_or_else(|diag| diag.emit_as_item_tokens())
}