#[macro_export]
macro_rules! insert_routes {
($router:expr => {$($paths:tt)+}) => {
{
use $crate::Router;
let mut router = $router;
__rustful_insert_internal!(router, [], $($paths)+);
router
}
}
}
#[doc(hidden)]
#[macro_export]
macro_rules! __rustful_insert_internal {
($router:ident, [$($steps:expr),*],$(,)*) => {{}};
($router:ident, [$($steps:expr),*], $path:expr => {$($paths:tt)+}, $($next:tt)*) => {
{
__rustful_insert_internal!($router, [$($steps,)* $path], $($paths)*);
__rustful_insert_internal!($router, [$($steps),*], $($next)*);
}
};
($router:ident, [$($steps:expr),*], $path:tt => {$($paths:tt)+}) => {
{
__rustful_insert_internal!($router, [$($steps,)* __rustful_to_expr!($path)], $($paths)*);
}
};
($router:ident, [$($steps:expr),*], $($method:tt)::+: $handler:expr, $($next:tt)*) => {
{
let method = {
#[allow(unused_imports)]
use $crate::Method::*;
__rustful_to_path!($($method)::+)
};
let path = __rustful_route_expr!($($steps),*);
$router.insert(method, &path, $handler);
__rustful_insert_internal!($router, [$($steps),*], $($next)*);
}
};
($router:ident, [$($steps:expr),*], $path:tt => $method:path: $handler:expr, $($next:tt)*) => {
{
let method = {
#[allow(unused_imports)]
use $crate::Method::*;
$method
};
let path = __rustful_route_expr!($($steps,)* __rustful_to_expr!($path));
$router.insert(method, &path, $handler);
__rustful_insert_internal!($router, [$($steps),*], $($next)*);
}
};
($router:ident, [$($steps:expr),*], $($method:tt)::+: $handler:expr) => {
{
let method = {
#[allow(unused_imports)]
use $crate::Method::*;
__rustful_to_path!($($method)::+)
};
let path = __rustful_route_expr!($($steps),*);
$router.insert(method, &path, $handler);
}
};
($router:ident, [$($steps:expr),*], $path:tt => $method:path: $handler:expr) => {
{
let method = {
#[allow(unused_imports)]
use $crate::Method::*;
$method
};
let path = __rustful_route_expr!($($steps,)* __rustful_to_expr!($path));
$router.insert(method, &path, $handler);
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __rustful_route_expr {
() => ("");
($($path:expr),+) => (&[$($path),+]);
}
#[macro_export]
macro_rules! content_type {
($main_type:tt / $sub_type:tt) => ({
use $crate::macros::MimeHelper;
$crate::mime::Mime (
{
#[allow(unused_imports)]
use $crate::mime::TopLevel::*;
MimeHelper::from(__rustful_to_expr!($main_type)).convert()
},
{
#[allow(unused_imports)]
use $crate::mime::SubLevel::*;
MimeHelper::from(__rustful_to_expr!($sub_type)).convert()
},
Vec::new()
)
});
($main_type:tt / $sub_type:tt; $($param:tt = $value:tt);+) => ({
use $crate::macros::MimeHelper;
$crate::mime::Mime (
{
#[allow(unused_imports)]
use $crate::mime::TopLevel::*;
MimeHelper::from(__rustful_to_expr!($main_type)).convert()
},
{
#[allow(unused_imports)]
use $crate::mime::SubLevel::*;
MimeHelper::from(__rustful_to_expr!($sub_type)).convert()
},
vec![ $( ({
#[allow(unused_imports)]
use $crate::mime::Attr::*;
MimeHelper::from(__rustful_to_expr!($param)).convert()
}, {
#[allow(unused_imports)]
use $crate::mime::Value::*;
MimeHelper::from(__rustful_to_expr!($value)).convert()
})),+ ]
)
});
}
#[doc(hidden)]
#[macro_export]
macro_rules! __rustful_to_expr {
($e: expr) => ($e)
}
#[doc(hidden)]
#[macro_export]
macro_rules! __rustful_to_path {
($e: path) => ($e)
}
use std::str::FromStr;
use std::fmt::Debug;
use mime::{TopLevel, SubLevel, Attr, Value};
#[doc(hidden)]
pub enum MimeHelper<'a, T> {
Str(&'a str),
Target(T)
}
impl<'a, T: FromStr> MimeHelper<'a, T> where <T as FromStr>::Err: Debug {
pub fn convert(self) -> T {
match self {
MimeHelper::Str(s) => s.parse().unwrap(),
MimeHelper::Target(t) => t
}
}
}
impl<'a, T: FromStr> From<&'a str> for MimeHelper<'a, T> {
fn from(s: &'a str) -> MimeHelper<'a, T> {
MimeHelper::Str(s)
}
}
impl<'a> From<TopLevel> for MimeHelper<'a, TopLevel> {
fn from(t: TopLevel) -> MimeHelper<'a, TopLevel> {
MimeHelper::Target(t)
}
}
impl<'a> From<SubLevel> for MimeHelper<'a, SubLevel> {
fn from(t: SubLevel) -> MimeHelper<'a, SubLevel> {
MimeHelper::Target(t)
}
}
impl<'a> From<Attr> for MimeHelper<'a, Attr> {
fn from(t: Attr) -> MimeHelper<'a, Attr> {
MimeHelper::Target(t)
}
}
impl<'a> From<Value> for MimeHelper<'a, Value> {
fn from(t: Value) -> MimeHelper<'a, Value> {
MimeHelper::Target(t)
}
}