use crate::route_matcher;
use crate::{ResponseWriter, Result};
use webui_protocol::{web_ui_fragment::Fragment, WebUIFragment};
pub(crate) fn write_escaped_state_attr(writer: &mut dyn ResponseWriter, value: &str) -> Result<()> {
let mut last = 0;
for (index, ch) in value.char_indices() {
let escaped = match ch {
'&' => Some("&"),
'"' => Some("""),
'<' => Some("<"),
'>' => Some(">"),
_ => None,
};
if let Some(entity) = escaped {
if last < index {
writer.write(&value[last..index])?;
}
writer.write(entity)?;
last = index + ch.len_utf8();
}
}
if last < value.len() {
writer.write(&value[last..])?;
}
Ok(())
}
pub(crate) fn find_best_route_match(
fragments: &[WebUIFragment],
request_path: &str,
route_base: &str,
) -> Option<(String, route_matcher::RouteMatch)> {
let mut best: Option<(String, route_matcher::RouteMatch)> = None;
for item in fragments {
if let Some(Fragment::Route(route_frag)) = item.fragment.as_ref() {
let resolved_path = route_matcher::resolve_route_path(&route_frag.path, route_base);
if let Some(m) =
route_matcher::match_single_route(&resolved_path, request_path, route_frag.exact)
{
let is_better = best
.as_ref()
.is_none_or(|(_, prev)| m.specificity > prev.specificity);
if is_better {
let key = route_frag.fragment_id.clone();
best = Some((key, m));
}
}
}
}
best
}