diff --git a/src/lib.rs b/src/lib.rs index 24420c5..6fbb9ee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ use nfa::NFA; use std::cmp::Ordering; use std::collections::btree_map; use std::collections::BTreeMap; +use std::collections::HashSet; use std::ops::Index; pub mod nfa; @@ -173,6 +174,12 @@ impl Router { metadata.statics += 1; } } + let mut hashes = HashSet::new(); + for name in metadata.param_names.iter() { + if !hashes.insert(name.to_string()) { + panic!("Duplicate name '{}' in route {}", name.to_string(), &route); + } + } nfa.acceptance(state); nfa.metadata(state, metadata); @@ -362,6 +369,41 @@ fn unnamed_parameters() { assert_eq!(m.params, params("bar", "test")); } +#[test] +#[should_panic] +fn duplicate_named_parameter() { + let mut router = Router::new(); + router.add("/foo/:bar/:bar", "test".to_string()); +} + +#[test] +#[should_panic] +fn duplicate_star_parameter() { + let mut router = Router::new(); + router.add("/foo/*bar/*bar", "test".to_string()); +} + +#[test] +#[should_panic] +fn duplicate_mixed_parameter() { + let mut router = Router::new(); + router.add("/foo/*bar/:bar", "test".to_string()); +} + +#[test] +#[should_panic] +fn duplicate_mixed_reversed_parameter() { + let mut router = Router::new(); + router.add("/foo/:bar/*bar", "test".to_string()); +} + +#[test] +#[should_panic] +fn duplicate_separated_parameter() { + let mut router = Router::new(); + router.add("/foo/:bar/bleg/:bar", "test".to_string()); +} + #[allow(dead_code)] fn params(key: &str, val: &str) -> Params { let mut map = Params::new();