Current section

Files

Jump to
rbt_weave crates weave-content src html countries.rs
Raw

crates/weave-content/src/html/countries.rs

//! Country name resolution from ISO 3166-1 alpha-2 codes.
//!
//! Re-exports core functions from [`crate::countries`] and adds
//! HTML-specific helpers (jurisdiction formatting, slug extraction).
use crate::domain::Jurisdiction;
// Re-export core functions so existing `use super::countries::*` in HTML modules still works.
pub(crate) use crate::countries::{country_name, is_special_scope};
/// Extract a country or scope code from a case slug like `cases/id/corruption/2024/...`.
///
/// Returns the second path segment when it is a valid jurisdiction code
/// (2-letter ISO country code or special scope like `multinational`, `int`).
pub(crate) fn extract_country_from_case_slug(slug: &str) -> Option<String> {
let parts: Vec<&str> = slug.split('/').collect();
if parts.len() >= 2 {
let candidate = parts[1];
if crate::countries::is_valid_jurisdiction_code(candidate) {
return Some(candidate.to_string());
}
}
None
}
/// Format jurisdiction as linked HTML (country part links to /countries/{code}).
/// Special scopes (INT, EU, MULTINATIONAL) are NOT linked.
pub(crate) fn format_jurisdiction_linked(j: &Jurisdiction) -> String {
let country_display = country_name(&j.country);
let country_html = if is_special_scope(&j.country) {
country_display
} else {
format!(
"<a href=\"/countries/{}\" class=\"loom-country-link\">{}</a>",
j.country.to_lowercase(),
country_display
)
};
match &j.subdivision {
Some(sub) => format!("{country_html}, {sub}"),
None => country_html,
}
}
pub(crate) fn format_jurisdiction(j: &Jurisdiction) -> String {
let country = country_name(&j.country);
match &j.subdivision {
Some(sub) => format!("{country}, {sub}"),
None => country,
}
}