diff options
Diffstat (limited to 'vendor/matchit/tests')
| -rw-r--r-- | vendor/matchit/tests/insert.rs | 243 | ||||
| -rw-r--r-- | vendor/matchit/tests/match.rs | 1047 | ||||
| -rw-r--r-- | vendor/matchit/tests/remove.rs | 265 |
3 files changed, 0 insertions, 1555 deletions
diff --git a/vendor/matchit/tests/insert.rs b/vendor/matchit/tests/insert.rs deleted file mode 100644 index 5513c1c6..00000000 --- a/vendor/matchit/tests/insert.rs +++ /dev/null @@ -1,243 +0,0 @@ -use matchit::{InsertError, Router}; - -struct InsertTest(Vec<(&'static str, Result<(), InsertError>)>); - -impl InsertTest { - fn run(self) { - let mut router = Router::new(); - for (route, expected) in self.0 { - let got = router.insert(route, route.to_owned()); - assert_eq!(got, expected, "{route}"); - } - } -} - -fn conflict(with: &'static str) -> InsertError { - InsertError::Conflict { with: with.into() } -} - -#[test] -fn wildcard_conflict() { - InsertTest(vec![ - ("/cmd/{tool}/{sub}", Ok(())), - ("/cmd/vet", Ok(())), - ("/foo/bar", Ok(())), - ("/foo/{name}", Ok(())), - ("/foo/{names}", Err(conflict("/foo/{name}"))), - ("/cmd/{*path}", Err(conflict("/cmd/{tool}/{sub}"))), - ("/cmd/{xxx}/names", Ok(())), - ("/cmd/{tool}/{xxx}/foo", Ok(())), - ("/src/{*filepath}", Ok(())), - ("/src/{file}", Err(conflict("/src/{*filepath}"))), - ("/src/static.json", Ok(())), - ("/src/$filepathx", Ok(())), - ("/src/", Ok(())), - ("/src/foo/bar", Ok(())), - ("/src1/", Ok(())), - ("/src1/{*filepath}", Ok(())), - ("/src2{*filepath}", Ok(())), - ("/src2/{*filepath}", Ok(())), - ("/src2/", Ok(())), - ("/src2", Ok(())), - ("/src3", Ok(())), - ("/src3/{*filepath}", Ok(())), - ("/search/{query}", Ok(())), - ("/search/valid", Ok(())), - ("/user_{name}", Ok(())), - ("/user_x", Ok(())), - ("/user_{bar}", Err(conflict("/user_{name}"))), - ("/id{id}", Ok(())), - ("/id/{id}", Ok(())), - ]) - .run() -} - -#[test] -fn invalid_catchall() { - InsertTest(vec![ - ("/non-leading-{*catchall}", Ok(())), - ("/foo/bar{*catchall}", Ok(())), - ("/src/{*filepath}/x", Err(InsertError::InvalidCatchAll)), - ("/src2/", Ok(())), - ("/src2/{*filepath}/x", Err(InsertError::InvalidCatchAll)), - ]) - .run() -} - -#[test] -fn catchall_root_conflict() { - InsertTest(vec![("/", Ok(())), ("/{*filepath}", Ok(()))]).run() -} - -#[test] -fn child_conflict() { - InsertTest(vec![ - ("/cmd/vet", Ok(())), - ("/cmd/{tool}", Ok(())), - ("/cmd/{tool}/{sub}", Ok(())), - ("/cmd/{tool}/misc", Ok(())), - ("/cmd/{tool}/{bad}", Err(conflict("/cmd/{tool}/{sub}"))), - ("/src/AUTHORS", Ok(())), - ("/src/{*filepath}", Ok(())), - ("/user_x", Ok(())), - ("/user_{name}", Ok(())), - ("/id/{id}", Ok(())), - ("/id{id}", Ok(())), - ("/{id}", Ok(())), - ("/{*filepath}", Err(conflict("/{id}"))), - ]) - .run() -} - -#[test] -fn duplicates() { - InsertTest(vec![ - ("/", Ok(())), - ("/", Err(conflict("/"))), - ("/doc/", Ok(())), - ("/doc/", Err(conflict("/doc/"))), - ("/src/{*filepath}", Ok(())), - ("/src/{*filepath}", Err(conflict("/src/{*filepath}"))), - ("/search/{query}", Ok(())), - ("/search/{query}", Err(conflict("/search/{query}"))), - ("/user_{name}", Ok(())), - ("/user_{name}", Err(conflict("/user_{name}"))), - ]) - .run() -} - -#[test] -fn unnamed_param() { - InsertTest(vec![ - ("/{}", Err(InsertError::InvalidParam)), - ("/user{}/", Err(InsertError::InvalidParam)), - ("/cmd/{}/", Err(InsertError::InvalidParam)), - ("/src/{*}", Err(InsertError::InvalidParam)), - ]) - .run() -} - -#[test] -fn double_params() { - InsertTest(vec![ - ("/{foo}{bar}", Err(InsertError::InvalidParamSegment)), - ("/{foo}{bar}/", Err(InsertError::InvalidParamSegment)), - ("/{foo}{{*bar}/", Err(InsertError::InvalidParamSegment)), - ]) - .run() -} - -#[test] -fn normalized_conflict() { - InsertTest(vec![ - ("/x/{foo}/bar", Ok(())), - ("/x/{bar}/bar", Err(conflict("/x/{foo}/bar"))), - ("/{y}/bar/baz", Ok(())), - ("/{y}/baz/baz", Ok(())), - ("/{z}/bar/bat", Ok(())), - ("/{z}/bar/baz", Err(conflict("/{y}/bar/baz"))), - ]) - .run() -} - -#[test] -fn more_conflicts() { - InsertTest(vec![ - ("/con{tact}", Ok(())), - ("/who/are/{*you}", Ok(())), - ("/who/foo/hello", Ok(())), - ("/whose/{users}/{name}", Ok(())), - ("/who/are/foo", Ok(())), - ("/who/are/foo/bar", Ok(())), - ("/con{nection}", Err(conflict("/con{tact}"))), - ( - "/whose/{users}/{user}", - Err(conflict("/whose/{users}/{name}")), - ), - ]) - .run() -} - -#[test] -fn catchall_static_overlap() { - InsertTest(vec![ - ("/bar", Ok(())), - ("/bar/", Ok(())), - ("/bar/{*foo}", Ok(())), - ]) - .run(); - - InsertTest(vec![ - ("/foo", Ok(())), - ("/{*bar}", Ok(())), - ("/bar", Ok(())), - ("/baz", Ok(())), - ("/baz/{split}", Ok(())), - ("/", Ok(())), - ("/{*bar}", Err(conflict("/{*bar}"))), - ("/{*zzz}", Err(conflict("/{*bar}"))), - ("/{xxx}", Err(conflict("/{*bar}"))), - ]) - .run(); - - InsertTest(vec![ - ("/{*bar}", Ok(())), - ("/bar", Ok(())), - ("/bar/x", Ok(())), - ("/bar_{x}", Ok(())), - ("/bar_{x}", Err(conflict("/bar_{x}"))), - ("/bar_{x}/y", Ok(())), - ("/bar/{x}", Ok(())), - ]) - .run(); -} - -#[test] -fn duplicate_conflict() { - InsertTest(vec![ - ("/hey", Ok(())), - ("/hey/users", Ok(())), - ("/hey/user", Ok(())), - ("/hey/user", Err(conflict("/hey/user"))), - ]) - .run() -} - -#[test] -fn invalid_param() { - InsertTest(vec![ - ("{", Err(InsertError::InvalidParam)), - ("}", Err(InsertError::InvalidParam)), - ("x{y", Err(InsertError::InvalidParam)), - ("x}", Err(InsertError::InvalidParam)), - ("/{foo}s", Err(InsertError::InvalidParamSegment)), - ]) - .run(); -} - -#[test] -fn escaped_param() { - InsertTest(vec![ - ("{{", Ok(())), - ("}}", Ok(())), - ("xx}}", Ok(())), - ("}}yy", Ok(())), - ("}}yy{{}}", Ok(())), - ("}}yy{{}}{{}}y{{", Ok(())), - ("}}yy{{}}{{}}y{{", Err(conflict("}yy{}{}y{"))), - ("/{{yy", Ok(())), - ("/{yy}", Ok(())), - ("/foo", Ok(())), - ("/foo/{{", Ok(())), - ("/foo/{{/{x}", Ok(())), - ("/foo/{ba{{r}", Ok(())), - ("/bar/{ba}}r}", Ok(())), - ("/xxx/{x{{}}y}", Ok(())), - ]) - .run() -} - -#[test] -fn bare_catchall() { - InsertTest(vec![("{*foo}", Ok(())), ("foo/{*bar}", Ok(()))]).run() -} diff --git a/vendor/matchit/tests/match.rs b/vendor/matchit/tests/match.rs deleted file mode 100644 index 90130fbc..00000000 --- a/vendor/matchit/tests/match.rs +++ /dev/null @@ -1,1047 +0,0 @@ -use matchit::{MatchError, Router}; - -// https://github.com/ibraheemdev/matchit/issues/22 -#[test] -fn partial_overlap() { - let mut x = Router::new(); - x.insert("/foo_bar", "Welcome!").unwrap(); - x.insert("/foo/bar", "Welcome!").unwrap(); - assert_eq!(x.at("/foo/").unwrap_err(), MatchError::NotFound); - - let mut x = Router::new(); - x.insert("/foo", "Welcome!").unwrap(); - x.insert("/foo/bar", "Welcome!").unwrap(); - assert_eq!(x.at("/foo/").unwrap_err(), MatchError::NotFound); -} - -// https://github.com/ibraheemdev/matchit/issues/31 -#[test] -fn wildcard_overlap() { - let mut router = Router::new(); - router.insert("/path/foo", "foo").unwrap(); - router.insert("/path/{*rest}", "wildcard").unwrap(); - - assert_eq!(router.at("/path/foo").map(|m| *m.value), Ok("foo")); - assert_eq!(router.at("/path/bar").map(|m| *m.value), Ok("wildcard")); - assert_eq!(router.at("/path/foo/").map(|m| *m.value), Ok("wildcard")); - - let mut router = Router::new(); - router.insert("/path/foo/{arg}", "foo").unwrap(); - router.insert("/path/{*rest}", "wildcard").unwrap(); - - assert_eq!(router.at("/path/foo/myarg").map(|m| *m.value), Ok("foo")); - assert_eq!( - router.at("/path/foo/myarg/").map(|m| *m.value), - Ok("wildcard") - ); - assert_eq!( - router.at("/path/foo/myarg/bar/baz").map(|m| *m.value), - Ok("wildcard") - ); -} - -// https://github.com/ibraheemdev/matchit/issues/12 -#[test] -fn overlapping_param_backtracking() { - let mut matcher = Router::new(); - - matcher.insert("/{object}/{id}", "object with id").unwrap(); - matcher - .insert("/secret/{id}/path", "secret with id and path") - .unwrap(); - - let matched = matcher.at("/secret/978/path").unwrap(); - assert_eq!(matched.params.get("id"), Some("978")); - - let matched = matcher.at("/something/978").unwrap(); - assert_eq!(matched.params.get("id"), Some("978")); - assert_eq!(matched.params.get("object"), Some("something")); - - let matched = matcher.at("/secret/978").unwrap(); - assert_eq!(matched.params.get("id"), Some("978")); -} - -struct MatchTest { - routes: Vec<&'static str>, - matches: Vec<( - &'static str, - &'static str, - Result<Vec<(&'static str, &'static str)>, ()>, - )>, -} - -impl MatchTest { - fn run(self) { - let mut router = Router::new(); - - for route in self.routes { - assert_eq!(router.insert(route, route.to_owned()), Ok(()), "{route}"); - } - - router.check_priorities().unwrap(); - - for (path, route, params) in self.matches { - match router.at(path) { - Ok(x) => { - assert_eq!(x.value, route); - - let got = x.params.iter().collect::<Vec<_>>(); - assert_eq!(params.unwrap(), got); - - router.at_mut(path).unwrap().value.push_str("Z"); - assert!(router.at(path).unwrap().value.contains("Z")); - router.at_mut(path).unwrap().value.pop(); - } - Err(_) => params.unwrap_err(), - } - } - } -} - -macro_rules! p { - ($($k:expr => $v:expr),* $(,)?) => { - Ok(vec![$(($k, $v)),*]) - }; -} - -// https://github.com/ibraheemdev/matchit/issues/42 -#[test] -fn bare_catchall() { - MatchTest { - routes: vec!["{*foo}", "foo/{*bar}"], - matches: vec![ - ("x/y", "{*foo}", p! { "foo" => "x/y" }), - ("/x/y", "{*foo}", p! { "foo" => "/x/y" }), - ("/foo/x/y", "{*foo}", p! { "foo" => "/foo/x/y" }), - ("foo/x/y", "foo/{*bar}", p! { "bar" => "x/y" }), - ], - } - .run() -} - -#[test] -fn normalized() { - MatchTest { - routes: vec![ - "/x/{foo}/bar", - "/x/{bar}/baz", - "/{foo}/{baz}/bax", - "/{foo}/{bar}/baz", - "/{fod}/{baz}/{bax}/foo", - "/{fod}/baz/bax/foo", - "/{foo}/baz/bax", - "/{bar}/{bay}/bay", - "/s", - "/s/s", - "/s/s/s", - "/s/s/s/s", - "/s/s/{s}/x", - "/s/s/{y}/d", - ], - matches: vec![ - ("/x/foo/bar", "/x/{foo}/bar", p! { "foo" => "foo" }), - ("/x/foo/baz", "/x/{bar}/baz", p! { "bar" => "foo" }), - ( - "/y/foo/baz", - "/{foo}/{bar}/baz", - p! { "foo" => "y", "bar" => "foo" }, - ), - ( - "/y/foo/bax", - "/{foo}/{baz}/bax", - p! { "foo" => "y", "baz" => "foo" }, - ), - ( - "/y/baz/baz", - "/{foo}/{bar}/baz", - p! { "foo" => "y", "bar" => "baz" }, - ), - ("/y/baz/bax/foo", "/{fod}/baz/bax/foo", p! { "fod" => "y" }), - ( - "/y/baz/b/foo", - "/{fod}/{baz}/{bax}/foo", - p! { "fod" => "y", "baz" => "baz", "bax" => "b" }, - ), - ("/y/baz/bax", "/{foo}/baz/bax", p! { "foo" => "y" }), - ( - "/z/bar/bay", - "/{bar}/{bay}/bay", - p! { "bar" => "z", "bay" => "bar" }, - ), - ("/s", "/s", p! {}), - ("/s/s", "/s/s", p! {}), - ("/s/s/s", "/s/s/s", p! {}), - ("/s/s/s/s", "/s/s/s/s", p! {}), - ("/s/s/s/x", "/s/s/{s}/x", p! { "s" => "s" }), - ("/s/s/s/d", "/s/s/{y}/d", p! { "y" => "s" }), - ], - } - .run() -} - -#[test] -fn blog() { - MatchTest { - routes: vec![ - "/{page}", - "/posts/{year}/{month}/{post}", - "/posts/{year}/{month}/index", - "/posts/{year}/top", - "/static/{*path}", - "/favicon.ico", - ], - matches: vec![ - ("/about", "/{page}", p! { "page" => "about" }), - ( - "/posts/2021/01/rust", - "/posts/{year}/{month}/{post}", - p! { "year" => "2021", "month" => "01", "post" => "rust" }, - ), - ( - "/posts/2021/01/index", - "/posts/{year}/{month}/index", - p! { "year" => "2021", "month" => "01" }, - ), - ( - "/posts/2021/top", - "/posts/{year}/top", - p! { "year" => "2021" }, - ), - ( - "/static/foo.png", - "/static/{*path}", - p! { "path" => "foo.png" }, - ), - ("/favicon.ico", "/favicon.ico", p! {}), - ], - } - .run() -} - -#[test] -fn double_overlap() { - MatchTest { - routes: vec![ - "/{object}/{id}", - "/secret/{id}/path", - "/secret/978", - "/other/{object}/{id}/", - "/other/an_object/{id}", - "/other/static/path", - "/other/long/static/path/", - ], - matches: vec![ - ( - "/secret/978/path", - "/secret/{id}/path", - p! { "id" => "978" }, - ), - ( - "/some_object/978", - "/{object}/{id}", - p! { "object" => "some_object", "id" => "978" }, - ), - ("/secret/978", "/secret/978", p! {}), - ("/super_secret/978/", "/{object}/{id}", Err(())), - ( - "/other/object/1/", - "/other/{object}/{id}/", - p! { "object" => "object", "id" => "1" }, - ), - ("/other/object/1/2", "/other/{object}/{id}", Err(())), - ( - "/other/an_object/1", - "/other/an_object/{id}", - p! { "id" => "1" }, - ), - ("/other/static/path", "/other/static/path", p! {}), - ( - "/other/long/static/path/", - "/other/long/static/path/", - p! {}, - ), - ], - } - .run() -} - -#[test] -fn catchall_off_by_one() { - MatchTest { - routes: vec!["/foo/{*catchall}", "/bar", "/bar/", "/bar/{*catchall}"], - matches: vec![ - ("/foo", "", Err(())), - ("/foo/", "", Err(())), - ("/foo/x", "/foo/{*catchall}", p! { "catchall" => "x" }), - ("/bar", "/bar", p! {}), - ("/bar/", "/bar/", p! {}), - ("/bar/x", "/bar/{*catchall}", p! { "catchall" => "x" }), - ], - } - .run() -} - -#[test] -fn overlap() { - MatchTest { - routes: vec![ - "/foo", - "/bar", - "/{*bar}", - "/baz", - "/baz/", - "/baz/x", - "/baz/{xxx}", - "/", - "/xxx/{*x}", - "/xxx/", - ], - matches: vec![ - ("/foo", "/foo", p! {}), - ("/bar", "/bar", p! {}), - ("/baz", "/baz", p! {}), - ("/baz/", "/baz/", p! {}), - ("/baz/x", "/baz/x", p! {}), - ("/???", "/{*bar}", p! { "bar" => "???" }), - ("/", "/", p! {}), - ("", "", Err(())), - ("/xxx/y", "/xxx/{*x}", p! { "x" => "y" }), - ("/xxx/", "/xxx/", p! {}), - ("/xxx", "/{*bar}", p! { "bar" => "xxx" }), - ], - } - .run() -} - -#[test] -fn missing_trailing_slash_param() { - MatchTest { - routes: vec!["/foo/{object}/{id}", "/foo/bar/baz", "/foo/secret/978/"], - matches: vec![ - ("/foo/secret/978/", "/foo/secret/978/", p! {}), - ( - "/foo/secret/978", - "/foo/{object}/{id}", - p! { "object" => "secret", "id" => "978" }, - ), - ], - } - .run() -} - -#[test] -fn extra_trailing_slash_param() { - MatchTest { - routes: vec!["/foo/{object}/{id}", "/foo/bar/baz", "/foo/secret/978"], - matches: vec![ - ("/foo/secret/978/", "", Err(())), - ("/foo/secret/978", "/foo/secret/978", p! {}), - ], - } - .run() -} - -#[test] -fn missing_trailing_slash_catch_all() { - MatchTest { - routes: vec!["/foo/{*bar}", "/foo/bar/baz", "/foo/secret/978/"], - matches: vec![ - ( - "/foo/secret/978", - "/foo/{*bar}", - p! { "bar" => "secret/978" }, - ), - ("/foo/secret/978/", "/foo/secret/978/", p! {}), - ], - } - .run() -} - -#[test] -fn extra_trailing_slash_catch_all() { - MatchTest { - routes: vec!["/foo/{*bar}", "/foo/bar/baz", "/foo/secret/978"], - matches: vec![ - ( - "/foo/secret/978/", - "/foo/{*bar}", - p! { "bar" => "secret/978/" }, - ), - ("/foo/secret/978", "/foo/secret/978", p! {}), - ], - } - .run() -} - -#[test] -fn double_overlap_trailing_slash() { - MatchTest { - routes: vec![ - "/{object}/{id}", - "/secret/{id}/path", - "/secret/978/", - "/other/{object}/{id}/", - "/other/an_object/{id}", - "/other/static/path", - "/other/long/static/path/", - ], - matches: vec![ - ("/secret/978/path/", "", Err(())), - ("/object/id/", "", Err(())), - ("/object/id/path", "", Err(())), - ("/other/object/1", "", Err(())), - ("/other/object/1/2", "", Err(())), - ( - "/other/an_object/1/", - "/other/{object}/{id}/", - p! { "object" => "an_object", "id" => "1" }, - ), - ( - "/other/static/path/", - "/other/{object}/{id}/", - p! { "object" => "static", "id" => "path" }, - ), - ("/other/long/static/path", "", Err(())), - ("/other/object/static/path", "", Err(())), - ], - } - .run() -} - -#[test] -fn trailing_slash_overlap() { - MatchTest { - routes: vec!["/foo/{x}/baz/", "/foo/{x}/baz", "/foo/bar/bar"], - matches: vec![ - ("/foo/x/baz/", "/foo/{x}/baz/", p! { "x" => "x" }), - ("/foo/x/baz", "/foo/{x}/baz", p! { "x" => "x" }), - ("/foo/bar/bar", "/foo/bar/bar", p! {}), - ], - } - .run() -} - -#[test] -fn trailing_slash() { - MatchTest { - routes: vec![ - "/hi", - "/b/", - "/search/{query}", - "/cmd/{tool}/", - "/src/{*filepath}", - "/x", - "/x/y", - "/y/", - "/y/z", - "/0/{id}", - "/0/{id}/1", - "/1/{id}/", - "/1/{id}/2", - "/aa", - "/a/", - "/admin", - "/admin/static", - "/admin/{category}", - "/admin/{category}/{page}", - "/doc", - "/doc/rust_faq.html", - "/doc/rust1.26.html", - "/no/a", - "/no/b", - "/no/a/b/{*other}", - "/api/{page}/{name}", - "/api/hello/{name}/bar/", - "/api/bar/{name}", - "/api/baz/foo", - "/api/baz/foo/bar", - "/foo/{p}", - ], - matches: vec![ - ("/hi/", "", Err(())), - ("/b", "", Err(())), - ("/search/rustacean/", "", Err(())), - ("/cmd/vet", "", Err(())), - ("/src", "", Err(())), - ("/src/", "", Err(())), - ("/x/", "", Err(())), - ("/y", "", Err(())), - ("/0/rust/", "", Err(())), - ("/1/rust", "", Err(())), - ("/a", "", Err(())), - ("/admin/", "", Err(())), - ("/doc/", "", Err(())), - ("/admin/static/", "", Err(())), - ("/admin/cfg/", "", Err(())), - ("/admin/cfg/users/", "", Err(())), - ("/api/hello/x/bar", "", Err(())), - ("/api/baz/foo/", "", Err(())), - ("/api/baz/bax/", "", Err(())), - ("/api/bar/huh/", "", Err(())), - ("/api/baz/foo/bar/", "", Err(())), - ("/api/world/abc/", "", Err(())), - ("/foo/pp/", "", Err(())), - ("/", "", Err(())), - ("/no", "", Err(())), - ("/no/", "", Err(())), - ("/no/a/b", "", Err(())), - ("/no/a/b/", "", Err(())), - ("/_", "", Err(())), - ("/_/", "", Err(())), - ("/api", "", Err(())), - ("/api/", "", Err(())), - ("/api/hello/x/foo", "", Err(())), - ("/api/baz/foo/bad", "", Err(())), - ("/foo/p/p", "", Err(())), - ], - } - .run() -} - -#[test] -fn backtracking_trailing_slash() { - MatchTest { - routes: vec!["/a/{b}/{c}", "/a/b/{c}/d/"], - matches: vec![("/a/b/c/d", "", Err(()))], - } - .run() -} - -#[test] -fn root_trailing_slash() { - MatchTest { - routes: vec!["/foo", "/bar", "/{baz}"], - matches: vec![("/", "", Err(()))], - } - .run() -} - -#[test] -fn catchall_overlap() { - MatchTest { - routes: vec!["/yyy/{*x}", "/yyy{*x}"], - matches: vec![ - ("/yyy/y", "/yyy/{*x}", p! { "x" => "y" }), - ("/yyy/", "/yyy{*x}", p! { "x" => "/" }), - ], - } - .run(); -} - -#[test] -fn escaped() { - MatchTest { - routes: vec![ - "/", - "/{{", - "/}}", - "/{{x", - "/}}y{{", - "/xy{{", - "/{{/xyz", - "/{ba{{r}", - "/{ba{{r}/", - "/{ba{{r}/x", - "/baz/{xxx}", - "/baz/{xxx}/xy{{", - "/baz/{xxx}/}}xy{{{{", - "/{{/{x}", - "/xxx/", - "/xxx/{x}}{{}}}}{{}}{{{{}}y}", - ], - matches: vec![ - ("/", "/", p! {}), - ("/{", "/{{", p! {}), - ("/}", "/}}", p! {}), - ("/{x", "/{{x", p! {}), - ("/}y{", "/}}y{{", p! {}), - ("/xy{", "/xy{{", p! {}), - ("/{/xyz", "/{{/xyz", p! {}), - ("/foo", "/{ba{{r}", p! { "ba{r" => "foo" }), - ("/{{", "/{ba{{r}", p! { "ba{r" => "{{" }), - ("/{{}}/", "/{ba{{r}/", p! { "ba{r" => "{{}}" }), - ("/{{}}{{/x", "/{ba{{r}/x", p! { "ba{r" => "{{}}{{" }), - ("/baz/x", "/baz/{xxx}", p! { "xxx" => "x" }), - ("/baz/x/xy{", "/baz/{xxx}/xy{{", p! { "xxx" => "x" }), - ("/baz/x/xy{{", "", Err(())), - ("/baz/x/}xy{{", "/baz/{xxx}/}}xy{{{{", p! { "xxx" => "x" }), - ("/{/{{", "/{{/{x}", p! { "x" => "{{" }), - ("/xxx", "/{ba{{r}", p! { "ba{r" => "xxx" }), - ("/xxx/", "/xxx/", p!()), - ( - "/xxx/foo", - "/xxx/{x}}{{}}}}{{}}{{{{}}y}", - p! { "x}{}}{}{{}y" => "foo" }, - ), - ], - } - .run() -} - -#[test] -fn basic() { - MatchTest { - routes: vec![ - "/hi", - "/contact", - "/co", - "/c", - "/a", - "/ab", - "/doc/", - "/doc/rust_faq.html", - "/doc/rust1.26.html", - "/ʯ", - "/β", - "/sd!here", - "/sd$here", - "/sd&here", - "/sd'here", - "/sd(here", - "/sd)here", - "/sd+here", - "/sd,here", - "/sd;here", - "/sd=here", - ], - matches: vec![ - ("/a", "/a", p! {}), - ("", "/", Err(())), - ("/hi", "/hi", p! {}), - ("/contact", "/contact", p! {}), - ("/co", "/co", p! {}), - ("", "/con", Err(())), - ("", "/cona", Err(())), - ("", "/no", Err(())), - ("/ab", "/ab", p! {}), - ("/ʯ", "/ʯ", p! {}), - ("/β", "/β", p! {}), - ("/sd!here", "/sd!here", p! {}), - ("/sd$here", "/sd$here", p! {}), - ("/sd&here", "/sd&here", p! {}), - ("/sd'here", "/sd'here", p! {}), - ("/sd(here", "/sd(here", p! {}), - ("/sd)here", "/sd)here", p! {}), - ("/sd+here", "/sd+here", p! {}), - ("/sd,here", "/sd,here", p! {}), - ("/sd;here", "/sd;here", p! {}), - ("/sd=here", "/sd=here", p! {}), - ], - } - .run() -} - -#[test] -fn wildcard() { - MatchTest { - routes: vec![ - "/", - "/cmd/{tool}/", - "/cmd/{tool2}/{sub}", - "/cmd/whoami", - "/cmd/whoami/root", - "/cmd/whoami/root/", - "/src", - "/src/", - "/src/{*filepath}", - "/search/", - "/search/{query}", - "/search/actix-web", - "/search/google", - "/user_{name}", - "/user_{name}/about", - "/files/{dir}/{*filepath}", - "/doc/", - "/doc/rust_faq.html", - "/doc/rust1.26.html", - "/info/{user}/public", - "/info/{user}/project/{project}", - "/info/{user}/project/rustlang", - "/aa/{*xx}", - "/ab/{*xx}", - "/ab/hello{*xx}", - "/{cc}", - "/c1/{dd}/e", - "/c1/{dd}/e1", - "/{cc}/cc", - "/{cc}/{dd}/ee", - "/{cc}/{dd}/{ee}/ff", - "/{cc}/{dd}/{ee}/{ff}/gg", - "/{cc}/{dd}/{ee}/{ff}/{gg}/hh", - "/get/test/abc/", - "/get/{param}/abc/", - "/something/{paramname}/thirdthing", - "/something/secondthing/test", - "/get/abc", - "/get/{param}", - "/get/abc/123abc", - "/get/abc/{param}", - "/get/abc/123abc/xxx8", - "/get/abc/123abc/{param}", - "/get/abc/123abc/xxx8/1234", - "/get/abc/123abc/xxx8/{param}", - "/get/abc/123abc/xxx8/1234/ffas", - "/get/abc/123abc/xxx8/1234/{param}", - "/get/abc/123abc/xxx8/1234/kkdd/12c", - "/get/abc/123abc/xxx8/1234/kkdd/{param}", - "/get/abc/{param}/test", - "/get/abc/123abd/{param}", - "/get/abc/123abddd/{param}", - "/get/abc/123/{param}", - "/get/abc/123abg/{param}", - "/get/abc/123abf/{param}", - "/get/abc/123abfff/{param}", - ], - matches: vec![ - ("/", "/", p! {}), - ("/cmd/test", "/cmd/{tool}/", Err(())), - ("/cmd/test/", "/cmd/{tool}/", p! { "tool" => "test" }), - ( - "/cmd/test/3", - "/cmd/{tool2}/{sub}", - p! { "tool2" => "test", "sub" => "3" }, - ), - ("/cmd/who", "/cmd/{tool}/", Err(())), - ("/cmd/who/", "/cmd/{tool}/", p! { "tool" => "who" }), - ("/cmd/whoami", "/cmd/whoami", p! {}), - ("/cmd/whoami/", "/cmd/{tool}/", p! { "tool" => "whoami" }), - ( - "/cmd/whoami/r", - "/cmd/{tool2}/{sub}", - p! { "tool2" => "whoami", "sub" => "r" }, - ), - ("/cmd/whoami/r/", "/cmd/{tool}/{sub}", Err(())), - ("/cmd/whoami/root", "/cmd/whoami/root", p! {}), - ("/cmd/whoami/root/", "/cmd/whoami/root/", p! {}), - ("/src", "/src", p! {}), - ("/src/", "/src/", p! {}), - ( - "/src/some/file.png", - "/src/{*filepath}", - p! { "filepath" => "some/file.png" }, - ), - ("/search/", "/search/", p! {}), - ( - "/search/actix", - "/search/{query}", - p! { "query" => "actix" }, - ), - ("/search/actix-web", "/search/actix-web", p! {}), - ( - "/search/someth!ng+in+ünìcodé", - "/search/{query}", - p! { "query" => "someth!ng+in+ünìcodé" }, - ), - ("/search/someth!ng+in+ünìcodé/", "", Err(())), - ( - "/user_rustacean", - "/user_{name}", - p! { "name" => "rustacean" }, - ), - ( - "/user_rustacean/about", - "/user_{name}/about", - p! { "name" => "rustacean" }, - ), - ( - "/files/js/inc/framework.js", - "/files/{dir}/{*filepath}", - p! { "dir" => "js", "filepath" => "inc/framework.js" }, - ), - ( - "/info/gordon/public", - "/info/{user}/public", - p! { "user" => "gordon" }, - ), - ( - "/info/gordon/project/rust", - "/info/{user}/project/{project}", - p! { "user" => "gordon", "project" => "rust" }, - ), - ( - "/info/gordon/project/rustlang", - "/info/{user}/project/rustlang", - p! { "user" => "gordon" }, - ), - ("/aa/", "/", Err(())), - ("/aa/aa", "/aa/{*xx}", p! { "xx" => "aa" }), - ("/ab/ab", "/ab/{*xx}", p! { "xx" => "ab" }), - ("/ab/hello-world", "/ab/hello{*xx}", p! { "xx" => "-world" }), - ("/a", "/{cc}", p! { "cc" => "a" }), - ("/all", "/{cc}", p! { "cc" => "all" }), - ("/d", "/{cc}", p! { "cc" => "d" }), - ("/ad", "/{cc}", p! { "cc" => "ad" }), - ("/dd", "/{cc}", p! { "cc" => "dd" }), - ("/dddaa", "/{cc}", p! { "cc" => "dddaa" }), - ("/aa", "/{cc}", p! { "cc" => "aa" }), - ("/aaa", "/{cc}", p! { "cc" => "aaa" }), - ("/aaa/cc", "/{cc}/cc", p! { "cc" => "aaa" }), - ("/ab", "/{cc}", p! { "cc" => "ab" }), - ("/abb", "/{cc}", p! { "cc" => "abb" }), - ("/abb/cc", "/{cc}/cc", p! { "cc" => "abb" }), - ("/allxxxx", "/{cc}", p! { "cc" => "allxxxx" }), - ("/alldd", "/{cc}", p! { "cc" => "alldd" }), - ("/all/cc", "/{cc}/cc", p! { "cc" => "all" }), - ("/a/cc", "/{cc}/cc", p! { "cc" => "a" }), - ("/c1/d/e", "/c1/{dd}/e", p! { "dd" => "d" }), - ("/c1/d/e1", "/c1/{dd}/e1", p! { "dd" => "d" }), - ( - "/c1/d/ee", - "/{cc}/{dd}/ee", - p! { "cc" => "c1", "dd" => "d" }, - ), - ("/cc/cc", "/{cc}/cc", p! { "cc" => "cc" }), - ("/ccc/cc", "/{cc}/cc", p! { "cc" => "ccc" }), - ("/deedwjfs/cc", "/{cc}/cc", p! { "cc" => "deedwjfs" }), - ("/acllcc/cc", "/{cc}/cc", p! { "cc" => "acllcc" }), - ("/get/test/abc/", "/get/test/abc/", p! {}), - ("/get/te/abc/", "/get/{param}/abc/", p! { "param" => "te" }), - ( - "/get/testaa/abc/", - "/get/{param}/abc/", - p! { "param" => "testaa" }, - ), - ("/get/xx/abc/", "/get/{param}/abc/", p! { "param" => "xx" }), - ("/get/tt/abc/", "/get/{param}/abc/", p! { "param" => "tt" }), - ("/get/a/abc/", "/get/{param}/abc/", p! { "param" => "a" }), - ("/get/t/abc/", "/get/{param}/abc/", p! { "param" => "t" }), - ("/get/aa/abc/", "/get/{param}/abc/", p! { "param" => "aa" }), - ( - "/get/abas/abc/", - "/get/{param}/abc/", - p! { "param" => "abas" }, - ), - ( - "/something/secondthing/test", - "/something/secondthing/test", - p! {}, - ), - ( - "/something/abcdad/thirdthing", - "/something/{paramname}/thirdthing", - p! { "paramname" => "abcdad" }, - ), - ( - "/something/secondthingaaaa/thirdthing", - "/something/{paramname}/thirdthing", - p! { "paramname" => "secondthingaaaa" }, - ), - ( - "/something/se/thirdthing", - "/something/{paramname}/thirdthing", - p! { "paramname" => "se" }, - ), - ( - "/something/s/thirdthing", - "/something/{paramname}/thirdthing", - p! { "paramname" => "s" }, - ), - ("/c/d/ee", "/{cc}/{dd}/ee", p! { "cc" => "c", "dd" => "d" }), - ( - "/c/d/e/ff", - "/{cc}/{dd}/{ee}/ff", - p! { "cc" => "c", "dd" => "d", "ee" => "e" }, - ), - ( - "/c/d/e/f/gg", - "/{cc}/{dd}/{ee}/{ff}/gg", - p! { "cc" => "c", "dd" => "d", "ee" => "e", "ff" => "f" }, - ), - ( - "/c/d/e/f/g/hh", - "/{cc}/{dd}/{ee}/{ff}/{gg}/hh", - p! { "cc" => "c", "dd" => "d", "ee" => "e", "ff" => "f", "gg" => "g" }, - ), - ( - "/cc/dd/ee/ff/gg/hh", - "/{cc}/{dd}/{ee}/{ff}/{gg}/hh", - p! { "cc" => "cc", "dd" => "dd", "ee" => "ee", "ff" => "ff", "gg" => "gg" }, - ), - ("/get/abc", "/get/abc", p! {}), - ("/get/a", "/get/{param}", p! { "param" => "a" }), - ("/get/abz", "/get/{param}", p! { "param" => "abz" }), - ("/get/12a", "/get/{param}", p! { "param" => "12a" }), - ("/get/abcd", "/get/{param}", p! { "param" => "abcd" }), - ("/get/abc/123abc", "/get/abc/123abc", p! {}), - ("/get/abc/12", "/get/abc/{param}", p! { "param" => "12" }), - ( - "/get/abc/123ab", - "/get/abc/{param}", - p! { "param" => "123ab" }, - ), - ("/get/abc/xyz", "/get/abc/{param}", p! { "param" => "xyz" }), - ( - "/get/abc/123abcddxx", - "/get/abc/{param}", - p! { "param" => "123abcddxx" }, - ), - ("/get/abc/123abc/xxx8", "/get/abc/123abc/xxx8", p! {}), - ( - "/get/abc/123abc/x", - "/get/abc/123abc/{param}", - p! { "param" => "x" }, - ), - ( - "/get/abc/123abc/xxx", - "/get/abc/123abc/{param}", - p! { "param" => "xxx" }, - ), - ( - "/get/abc/123abc/abc", - "/get/abc/123abc/{param}", - p! { "param" => "abc" }, - ), - ( - "/get/abc/123abc/xxx8xxas", - "/get/abc/123abc/{param}", - p! { "param" => "xxx8xxas" }, - ), - ( - "/get/abc/123abc/xxx8/1234", - "/get/abc/123abc/xxx8/1234", - p! {}, - ), - ( - "/get/abc/123abc/xxx8/1", - "/get/abc/123abc/xxx8/{param}", - p! { "param" => "1" }, - ), - ( - "/get/abc/123abc/xxx8/123", - "/get/abc/123abc/xxx8/{param}", - p! { "param" => "123" }, - ), - ( - "/get/abc/123abc/xxx8/78k", - "/get/abc/123abc/xxx8/{param}", - p! { "param" => "78k" }, - ), - ( - "/get/abc/123abc/xxx8/1234xxxd", - "/get/abc/123abc/xxx8/{param}", - p! { "param" => "1234xxxd" }, - ), - ( - "/get/abc/123abc/xxx8/1234/ffas", - "/get/abc/123abc/xxx8/1234/ffas", - p! {}, - ), - ( - "/get/abc/123abc/xxx8/1234/f", - "/get/abc/123abc/xxx8/1234/{param}", - p! { "param" => "f" }, - ), - ( - "/get/abc/123abc/xxx8/1234/ffa", - "/get/abc/123abc/xxx8/1234/{param}", - p! { "param" => "ffa" }, - ), - ( - "/get/abc/123abc/xxx8/1234/kka", - "/get/abc/123abc/xxx8/1234/{param}", - p! { "param" => "kka" }, - ), - ( - "/get/abc/123abc/xxx8/1234/ffas321", - "/get/abc/123abc/xxx8/1234/{param}", - p! { "param" => "ffas321" }, - ), - ( - "/get/abc/123abc/xxx8/1234/kkdd/12c", - "/get/abc/123abc/xxx8/1234/kkdd/12c", - p! {}, - ), - ( - "/get/abc/123abc/xxx8/1234/kkdd/1", - "/get/abc/123abc/xxx8/1234/kkdd/{param}", - p! { "param" => "1" }, - ), - ( - "/get/abc/123abc/xxx8/1234/kkdd/12", - "/get/abc/123abc/xxx8/1234/kkdd/{param}", - p! { "param" => "12" }, - ), - ( - "/get/abc/123abc/xxx8/1234/kkdd/12b", - "/get/abc/123abc/xxx8/1234/kkdd/{param}", - p! { "param" => "12b" }, - ), - ( - "/get/abc/123abc/xxx8/1234/kkdd/34", - "/get/abc/123abc/xxx8/1234/kkdd/{param}", - p! { "param" => "34" }, - ), - ( - "/get/abc/123abc/xxx8/1234/kkdd/12c2e3", - "/get/abc/123abc/xxx8/1234/kkdd/{param}", - p! { "param" => "12c2e3" }, - ), - ( - "/get/abc/12/test", - "/get/abc/{param}/test", - p! { "param" => "12" }, - ), - ( - "/get/abc/123abdd/test", - "/get/abc/{param}/test", - p! { "param" => "123abdd" }, - ), - ( - "/get/abc/123abdddf/test", - "/get/abc/{param}/test", - p! { "param" => "123abdddf" }, - ), - ( - "/get/abc/123ab/test", - "/get/abc/{param}/test", - p! { "param" => "123ab" }, - ), - ( - "/get/abc/123abgg/test", - "/get/abc/{param}/test", - p! { "param" => "123abgg" }, - ), - ( - "/get/abc/123abff/test", - "/get/abc/{param}/test", - p! { "param" => "123abff" }, - ), - ( - "/get/abc/123abffff/test", - "/get/abc/{param}/test", - p! { "param" => "123abffff" }, - ), - ( - "/get/abc/123abd/test", - "/get/abc/123abd/{param}", - p! { "param" => "test" }, - ), - ( - "/get/abc/123abddd/test", - "/get/abc/123abddd/{param}", - p! { "param" => "test" }, - ), - ( - "/get/abc/123/test22", - "/get/abc/123/{param}", - p! { "param" => "test22" }, - ), - ( - "/get/abc/123abg/test", - "/get/abc/123abg/{param}", - p! { "param" => "test" }, - ), - ( - "/get/abc/123abf/testss", - "/get/abc/123abf/{param}", - p! { "param" => "testss" }, - ), - ( - "/get/abc/123abfff/te", - "/get/abc/123abfff/{param}", - p! { "param" => "te" }, - ), - ], - } - .run() -} diff --git a/vendor/matchit/tests/remove.rs b/vendor/matchit/tests/remove.rs deleted file mode 100644 index 3237ccde..00000000 --- a/vendor/matchit/tests/remove.rs +++ /dev/null @@ -1,265 +0,0 @@ -use matchit::Router; - -struct RemoveTest { - routes: Vec<&'static str>, - ops: Vec<(Operation, &'static str, Option<&'static str>)>, - remaining: Vec<&'static str>, -} - -enum Operation { - Insert, - Remove, -} - -use Operation::*; - -impl RemoveTest { - fn run(self) { - let mut router = Router::new(); - - for route in self.routes.iter() { - assert_eq!(router.insert(*route, route.to_owned()), Ok(()), "{route}"); - } - - for (op, route, expected) in self.ops.iter() { - match op { - Insert => { - assert_eq!(router.insert(*route, route), Ok(()), "{route}") - } - Remove => { - assert_eq!(router.remove(*route), *expected, "removing {route}",) - } - } - } - - for route in self.remaining { - assert!(matches!(router.at(route), Ok(_)), "remaining {route}"); - } - } -} - -#[test] -fn normalized() { - RemoveTest { - routes: vec![ - "/x/{foo}/bar", - "/x/{bar}/baz", - "/{foo}/{baz}/bax", - "/{foo}/{bar}/baz", - "/{fod}/{baz}/{bax}/foo", - "/{fod}/baz/bax/foo", - "/{foo}/baz/bax", - "/{bar}/{bay}/bay", - "/s", - "/s/s", - "/s/s/s", - "/s/s/s/s", - "/s/s/{s}/x", - "/s/s/{y}/d", - ], - ops: vec![ - (Remove, "/x/{foo}/bar", Some("/x/{foo}/bar")), - (Remove, "/x/{bar}/baz", Some("/x/{bar}/baz")), - (Remove, "/{foo}/{baz}/bax", Some("/{foo}/{baz}/bax")), - (Remove, "/{foo}/{bar}/baz", Some("/{foo}/{bar}/baz")), - ( - Remove, - "/{fod}/{baz}/{bax}/foo", - Some("/{fod}/{baz}/{bax}/foo"), - ), - (Remove, "/{fod}/baz/bax/foo", Some("/{fod}/baz/bax/foo")), - (Remove, "/{foo}/baz/bax", Some("/{foo}/baz/bax")), - (Remove, "/{bar}/{bay}/bay", Some("/{bar}/{bay}/bay")), - (Remove, "/s", Some("/s")), - (Remove, "/s/s", Some("/s/s")), - (Remove, "/s/s/s", Some("/s/s/s")), - (Remove, "/s/s/s/s", Some("/s/s/s/s")), - (Remove, "/s/s/{s}/x", Some("/s/s/{s}/x")), - (Remove, "/s/s/{y}/d", Some("/s/s/{y}/d")), - ], - remaining: vec![], - } - .run(); -} - -#[test] -fn test() { - RemoveTest { - routes: vec!["/home", "/home/{id}"], - ops: vec![ - (Remove, "/home", Some("/home")), - (Remove, "/home", None), - (Remove, "/home/{id}", Some("/home/{id}")), - (Remove, "/home/{id}", None), - ], - remaining: vec![], - } - .run(); -} - -#[test] -fn blog() { - RemoveTest { - routes: vec![ - "/{page}", - "/posts/{year}/{month}/{post}", - "/posts/{year}/{month}/index", - "/posts/{year}/top", - "/static/{*path}", - "/favicon.ico", - ], - ops: vec![ - (Remove, "/{page}", Some("/{page}")), - ( - Remove, - "/posts/{year}/{month}/{post}", - Some("/posts/{year}/{month}/{post}"), - ), - ( - Remove, - "/posts/{year}/{month}/index", - Some("/posts/{year}/{month}/index"), - ), - (Remove, "/posts/{year}/top", Some("/posts/{year}/top")), - (Remove, "/static/{*path}", Some("/static/{*path}")), - (Remove, "/favicon.ico", Some("/favicon.ico")), - ], - remaining: vec![], - } - .run() -} - -#[test] -fn catchall() { - RemoveTest { - routes: vec!["/foo/{*catchall}", "/bar", "/bar/", "/bar/{*catchall}"], - ops: vec![ - (Remove, "/foo/{*catchall}", Some("/foo/{*catchall}")), - (Remove, "/bar/", Some("/bar/")), - (Insert, "/foo/*catchall", Some("/foo/*catchall")), - (Remove, "/bar/{*catchall}", Some("/bar/{*catchall}")), - ], - remaining: vec!["/bar", "/foo/*catchall"], - } - .run(); -} - -#[test] -fn overlapping_routes() { - RemoveTest { - routes: vec![ - "/home", - "/home/{id}", - "/users", - "/users/{id}", - "/users/{id}/posts", - "/users/{id}/posts/{post_id}", - "/articles", - "/articles/{category}", - "/articles/{category}/{id}", - ], - ops: vec![ - (Remove, "/home", Some("/home")), - (Insert, "/home", Some("/home")), - (Remove, "/home/{id}", Some("/home/{id}")), - (Insert, "/home/{id}", Some("/home/{id}")), - (Remove, "/users", Some("/users")), - (Insert, "/users", Some("/users")), - (Remove, "/users/{id}", Some("/users/{id}")), - (Insert, "/users/{id}", Some("/users/{id}")), - (Remove, "/users/{id}/posts", Some("/users/{id}/posts")), - (Insert, "/users/{id}/posts", Some("/users/{id}/posts")), - ( - Remove, - "/users/{id}/posts/{post_id}", - Some("/users/{id}/posts/{post_id}"), - ), - ( - Insert, - "/users/{id}/posts/{post_id}", - Some("/users/{id}/posts/{post_id}"), - ), - (Remove, "/articles", Some("/articles")), - (Insert, "/articles", Some("/articles")), - (Remove, "/articles/{category}", Some("/articles/{category}")), - (Insert, "/articles/{category}", Some("/articles/{category}")), - ( - Remove, - "/articles/{category}/{id}", - Some("/articles/{category}/{id}"), - ), - ( - Insert, - "/articles/{category}/{id}", - Some("/articles/{category}/{id}"), - ), - ], - remaining: vec![ - "/home", - "/home/{id}", - "/users", - "/users/{id}", - "/users/{id}/posts", - "/users/{id}/posts/{post_id}", - "/articles", - "/articles/{category}", - "/articles/{category}/{id}", - ], - } - .run(); -} - -#[test] -fn trailing_slash() { - RemoveTest { - routes: vec!["/{home}/", "/foo"], - ops: vec![ - (Remove, "/", None), - (Remove, "/{home}", None), - (Remove, "/foo/", None), - (Remove, "/foo", Some("/foo")), - (Remove, "/{home}", None), - (Remove, "/{home}/", Some("/{home}/")), - ], - remaining: vec![], - } - .run(); -} - -#[test] -fn remove_root() { - RemoveTest { - routes: vec!["/"], - ops: vec![(Remove, "/", Some("/"))], - remaining: vec![], - } - .run(); -} - -#[test] -fn check_escaped_params() { - RemoveTest { - routes: vec![ - "/foo/{id}", - "/foo/{id}/bar", - "/bar/{user}/{id}", - "/bar/{user}/{id}/baz", - "/baz/{product}/{user}/{id}", - ], - ops: vec![ - (Remove, "/foo/{a}", None), - (Remove, "/foo/{a}/bar", None), - (Remove, "/bar/{a}/{b}", None), - (Remove, "/bar/{a}/{b}/baz", None), - (Remove, "/baz/{a}/{b}/{c}", None), - ], - remaining: vec![ - "/foo/{id}", - "/foo/{id}/bar", - "/bar/{user}/{id}", - "/bar/{user}/{id}/baz", - "/baz/{product}/{user}/{id}", - ], - } - .run(); -} |
