use crate::HapError;
use crate::record;
use crate::value::{self, Findings, Line, Note, Obj};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[non_exhaustive]
pub struct PageList {
pub pages: Vec<String>,
pub notes: Vec<Note>,
}
impl PageList {
pub fn parse(bytes: &[u8]) -> Result<Self, HapError> {
let map = value::parse_object(bytes)?;
let mut findings = Findings::default();
let mut root = Obj::root(&map, &mut findings);
let pages = root.strings("src");
Ok(PageList { pages, notes: findings.notes })
}
pub fn src_entry(page: &str) -> String {
format!("./ets/{}", page.trim_start_matches("./").trim_start_matches('/'))
}
pub fn line(page: &str) -> String {
Line::new("page").word(page).end()
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[non_exhaustive]
pub struct RouterMap {
pub routes: Vec<Route>,
pub notes: Vec<Note>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[non_exhaustive]
pub struct Route {
pub name: Option<String>,
pub page_source_file: Option<String>,
pub build_function: Option<String>,
pub ohmurl: Option<String>,
pub package_name: Option<String>,
pub module_name: Option<String>,
pub bundle_name: Option<String>,
}
impl Route {
pub fn ohmurl_record(&self) -> Option<&str> {
let rest = self.ohmurl.as_deref()?.strip_prefix("@normalized:N&")?;
let (_module, record) = rest.split_once('&')?;
let (_bundle, tail) = record.split_once('&')?;
let (path, _version) = tail.rsplit_once('&')?;
(!path.is_empty()).then_some(record)
}
pub fn line(&self) -> String {
Line::new("route")
.word(self.name.as_deref().unwrap_or("-"))
.opt("buildFunction", self.build_function.as_deref())
.opt("source", self.page_source_file.as_deref())
.opt_present("package", self.package_name.as_deref())
.end()
}
pub fn ohmurl_module(&self) -> Option<&str> {
let rest = self.ohmurl.as_deref()?.strip_prefix("@normalized:N&")?;
rest.split_once('&').map(|(module, _)| module)
}
pub fn record_path(&self, default_package: Option<&str>) -> Option<String> {
let source = self.page_source_file.as_deref()?.trim_start_matches("./").trim_start_matches('/');
let package = self.package_name.as_deref().or(default_package)?;
Some(format!("{package}/{}", record::strip_source_extension(source)))
}
}
impl RouterMap {
pub fn parse(bytes: &[u8]) -> Result<Self, HapError> {
let map = value::parse_object(bytes)?;
let mut findings = Findings::default();
let mut root = Obj::root(&map, &mut findings);
let routes = root.objects("routerMap", |route| Route {
name: route.str("name"),
page_source_file: route.str("pageSourceFile"),
build_function: route.str("buildFunction"),
ohmurl: route.str("ohmurl"),
package_name: route.str("packageName"),
module_name: route.str("moduleName"),
bundle_name: route.str("bundleName"),
});
Ok(RouterMap { routes, notes: findings.notes })
}
}