use super::*;
impl RoutePage {
pub fn get_route(&self) -> &'static str {
self.route
}
}
impl RouteLocale {
pub fn get_prefix(&self) -> &'static str {
self.prefix
}
}
impl RouteSite {
pub fn get_locale(&self, route: &str) -> &'static RouteLocale {
self.locale_of(route).unwrap_or(&ROUTE_LOCALE_ROOT)
}
pub fn get_locales(&self) -> &'static [RouteLocale] {
self.locales
}
pub fn get_pages(&self) -> &'static [RoutePage] {
self.pages
}
pub fn new(locales: &'static [RouteLocale], pages: &'static [RoutePage]) -> RouteSite {
RouteSite { locales, pages }
}
pub fn locale_of(&self, route: &str) -> Option<&'static RouteLocale> {
let locales: &'static [RouteLocale] = self.get_locales();
let mut owner: Option<&'static RouteLocale> = None;
let mut owner_len: usize = 0;
for locale in locales {
let prefix: &str = locale.prefix;
if prefix == ROUTE_ROOT || !route.starts_with(prefix) || prefix.len() <= owner_len {
continue;
}
owner = Some(locale);
owner_len = prefix.len();
}
owner.or_else(|| {
locales
.iter()
.find(|locale: &&RouteLocale| locale.get_prefix() == ROUTE_ROOT)
.or_else(|| locales.first())
})
}
pub fn find_page(&self, request: &str) -> Option<&'static RoutePage> {
let pages: &'static [RoutePage] = self.get_pages();
let normalized: String = normalize_route(request);
if let Some(exact) = pages
.iter()
.find(|page: &&RoutePage| page.get_route() == normalized)
{
return Some(exact);
}
route_candidates(&normalized)
.into_iter()
.find_map(|candidate: String| {
pages
.iter()
.find(|page: &&RoutePage| page.get_route() == candidate)
})
}
pub fn audit_route_variants(&self, route: &str) -> Vec<(String, bool)> {
route_variants(route)
.into_iter()
.map(|variant: String| {
let resolved: bool = self.find_page(&variant).is_some();
(variant, resolved)
})
.collect()
}
pub fn find_page_without_locale_prefix(
&self,
route: &str,
locale_prefix: &str,
) -> Option<&'static RoutePage> {
let stripped: String = route_without_locale_prefix(route, locale_prefix);
self.find_page(&stripped)
}
pub fn audit_all_route_variants(&self) -> Vec<String> {
let mut missing: Vec<String> = Vec::new();
for page in self.get_pages() {
let route: &str = page.get_route();
for (variant, resolved) in self.audit_route_variants(route) {
if !resolved {
missing.push(format!("{route} -> {variant}"));
}
}
}
missing
}
}