2019-09-21 20:36:57 +00:00
|
|
|
use devise::Result;
|
2018-09-16 07:44:47 +00:00
|
|
|
|
2019-09-21 20:36:57 +00:00
|
|
|
use crate::syn::{Path, punctuated::Punctuated, parse::Parser, Token};
|
|
|
|
use crate::proc_macro2::TokenStream;
|
2020-10-13 05:11:44 +00:00
|
|
|
use crate::syn::spanned::Spanned;
|
2018-09-16 07:44:47 +00:00
|
|
|
|
2018-09-20 04:47:58 +00:00
|
|
|
mod uri;
|
|
|
|
mod uri_parsing;
|
2020-02-15 11:43:47 +00:00
|
|
|
mod test_guide;
|
2018-09-20 04:47:58 +00:00
|
|
|
|
2020-10-13 05:11:44 +00:00
|
|
|
fn struct_maker_vec(
|
2019-09-21 20:36:57 +00:00
|
|
|
input: proc_macro::TokenStream,
|
2020-10-13 05:11:44 +00:00
|
|
|
ty: TokenStream,
|
2019-09-21 20:36:57 +00:00
|
|
|
) -> Result<TokenStream> {
|
2020-10-13 05:11:44 +00:00
|
|
|
define_vars_and_mods!(_Vec);
|
2018-09-16 07:44:47 +00:00
|
|
|
|
2020-10-13 05:11:44 +00:00
|
|
|
// Parse a comma-separated list of paths.
|
|
|
|
let paths = <Punctuated<Path, Token![,]>>::parse_terminated.parse(input)?;
|
|
|
|
let exprs = paths.iter()
|
|
|
|
.map(|path| quote_spanned!(path.span() => {
|
|
|
|
let ___struct = #path {};
|
|
|
|
let ___item: #ty = ___struct.into();
|
|
|
|
___item
|
|
|
|
}));
|
2018-09-16 07:44:47 +00:00
|
|
|
|
2020-10-13 05:11:44 +00:00
|
|
|
Ok(quote!({
|
|
|
|
let ___vec: #_Vec<#ty> = vec![#(#exprs),*];
|
|
|
|
___vec
|
|
|
|
}))
|
2018-09-16 07:44:47 +00:00
|
|
|
}
|
|
|
|
|
2019-09-21 20:36:57 +00:00
|
|
|
pub fn routes_macro(input: proc_macro::TokenStream) -> TokenStream {
|
2020-10-13 05:11:44 +00:00
|
|
|
struct_maker_vec(input, quote!(::rocket::Route))
|
|
|
|
.unwrap_or_else(|diag| diag.emit_as_expr_tokens())
|
2018-09-16 07:44:47 +00:00
|
|
|
}
|
|
|
|
|
2019-09-21 20:36:57 +00:00
|
|
|
pub fn catchers_macro(input: proc_macro::TokenStream) -> TokenStream {
|
2020-10-13 05:11:44 +00:00
|
|
|
struct_maker_vec(input, quote!(::rocket::Catcher))
|
|
|
|
.unwrap_or_else(|diag| diag.emit_as_expr_tokens())
|
2018-09-16 07:44:47 +00:00
|
|
|
}
|
2018-09-20 04:47:58 +00:00
|
|
|
|
2019-09-21 20:36:57 +00:00
|
|
|
pub fn uri_macro(input: proc_macro::TokenStream) -> TokenStream {
|
|
|
|
uri::_uri_macro(input.into())
|
2020-07-21 17:23:59 +00:00
|
|
|
.unwrap_or_else(|diag| diag.emit_as_expr_tokens())
|
2018-09-20 04:47:58 +00:00
|
|
|
}
|
|
|
|
|
2019-09-21 20:36:57 +00:00
|
|
|
pub fn uri_internal_macro(input: proc_macro::TokenStream) -> TokenStream {
|
2020-07-21 17:23:59 +00:00
|
|
|
let tokens = uri::_uri_internal_macro(input.into())
|
|
|
|
.unwrap_or_else(|diag| diag.emit_as_expr_tokens());
|
|
|
|
tokens
|
2018-09-20 04:47:58 +00:00
|
|
|
}
|
2020-02-15 11:43:47 +00:00
|
|
|
|
2019-09-21 20:36:57 +00:00
|
|
|
pub fn guide_tests_internal(input: proc_macro::TokenStream) -> TokenStream {
|
2020-02-15 11:43:47 +00:00
|
|
|
test_guide::_macro(input)
|
2020-07-21 17:23:59 +00:00
|
|
|
.unwrap_or_else(|diag| diag.emit_as_item_tokens())
|
2020-02-15 11:43:47 +00:00
|
|
|
}
|