tower_web/routing/
set.rs

1use super::{Route, Captures};
2
3use http::Request;
4
5/// A set of routes
6///
7/// Matches an HTTP request with a route, which in turn maps to a resource
8/// method.
9#[derive(Debug)]
10pub struct RouteSet<T> {
11    routes: Vec<Route<T>>,
12}
13
14// ===== impl RouteSet =====
15
16impl<T> RouteSet<T> {
17    /// Create a new, empty, `RouteSet`.
18    pub fn new() -> RouteSet<T> {
19        RouteSet { routes: vec![] }
20    }
21
22    pub(crate) fn map<F, U>(self, f: F) -> RouteSet<U>
23    where F: Fn(T) -> U,
24    {
25        RouteSet {
26            routes: self.routes.into_iter().map(|r| r.map(&f)).collect()
27        }
28    }
29
30    pub(crate) fn insert(&mut self, route: Route<T>) {
31        self.routes.push(route);
32    }
33
34    pub(crate) fn insert_all(&mut self, set: RouteSet<T>) {
35        self.routes.extend(set.routes);
36    }
37}
38
39impl<T> RouteSet<T>
40where
41    T: Clone,
42{
43    /// Match a request against a route set
44    pub(crate) fn test(&self, request: &Request<()>) -> Option<(T, Captures)> {
45        self.routes
46            .iter()
47            .flat_map(|route| route.test(request))
48            .next()
49    }
50}