use crate::http::Response; pub use crate::url_map; pub use warp::path as warp_path; pub type UrlMap = warp::filters::BoxedFilter<(Response,)>; #[doc(hidden)] #[macro_export] macro_rules! __url_map_inner { (@root => $view:expr, $($rest:tt)*) => {{ let chain = $crate::__url_map_inner!(@one => $view); $crate::__url_map_inner!(chain @rest $($rest)*) }}; (@root $head:tt $(/ $tail:tt)* => $view:expr, $($rest:tt)*) => {{ let chain = $crate::__url_map_inner!(@one $head $(/ $tail)* => $view); $crate::__url_map_inner!(chain @rest $($rest)*) }}; (@root $head:tt $(/ $tail:tt)* $child:expr, $($rest:tt)*) => {{ let chain = $crate::__url_map_inner!(@one $head $(/ $tail)* $child); $crate::__url_map_inner!(chain @rest $($rest)*) }}; ($chain:ident @rest => $view:expr, $($rest:tt)*) => {{ let chain = $chain .or($crate::__url_map_inner!(@one => $view)) .unify(); $crate::__url_map_inner!(chain @rest $($rest)*) }}; ($chain:ident @rest $head:tt $(/ $tail:tt)* => $view:expr, $($rest:tt)*) => {{ let chain = $chain .or($crate::__url_map_inner!(@one $head $(/ $tail)* => $view)) .unify(); $crate::__url_map_inner!(chain @rest $($rest)*) }}; ($chain:ident @rest $head:tt $(/ $tail:tt)* $child:expr, $($rest:tt)*) => {{ let chain = $chain .or($crate::__url_map_inner!(@one $head $(/ $tail)* $child)) .unify(); $crate::__url_map_inner!(chain @rest $($rest)*) }}; ($chain:ident @rest) => { $chain }; (@one => $view:expr) => { $crate::urls::warp_path::end().map($view) }; (@one $head:tt $(/ $tail:tt)* => $view:expr) => { $crate::urls::warp_path!($head $(/ $tail)*).map($view) }; (@one $head:tt $(/ $tail:tt)* $child:expr) => { $crate::urls::warp_path!($head $(/ $tail)*).and($child) }; } #[macro_export] macro_rules! url_map { ($($body:tt)*) => {{ use $crate::http::Filter; $crate::__url_map_inner!(@root $($body)*) .boxed() }}; }