use crate::urls::resolvers::{URLPattern, join_routes, normalize_route};
#[must_use]
pub fn path(route: &str, name: Option<&str>) -> URLPattern {
URLPattern {
name: name.map(str::to_owned),
route: normalize_route(route),
view_name: String::new(),
}
}
#[must_use]
pub fn include(prefix: &str, patterns: Vec<URLPattern>) -> Vec<URLPattern> {
patterns
.into_iter()
.map(|mut pattern| {
pattern.route = join_routes(prefix, &pattern.route);
pattern
})
.collect()
}
#[cfg(test)]
mod tests {
use super::{include, path};
#[test]
fn path_creates_named_patterns() {
let pattern = path("/users/<int:id>", Some("user-detail"));
assert_eq!(pattern.route, "/users/<int:id>");
assert_eq!(pattern.name.as_deref(), Some("user-detail"));
assert!(pattern.view_name.is_empty());
}
#[test]
fn include_prefixes_nested_patterns() {
let nested = vec![
path("/", Some("api-index")),
path("/users/<int:id>", Some("user-detail")),
];
let included = include("/api/", nested);
assert_eq!(included[0].route, "/api/");
assert_eq!(included[1].route, "/api/users/<int:id>");
assert_eq!(included[1].name.as_deref(), Some("user-detail"));
}
}