use anyhow::{Context, Result};
pub fn resolve_json_url(html_url: &str, data_url: &str) -> Result<String> {
if data_url.starts_with("https://") || data_url.starts_with("http://") {
return Ok(data_url.to_string());
}
let last_slash = html_url.rfind('/').context("No slash in URL")?;
let url_prefix = &html_url[..=last_slash];
Ok(format!("{url_prefix}{data_url}"))
}
pub fn extract_raw_header_url(html: &str) -> Result<&str> {
let lhs_search = r#"<meta name="bmstable" content=""#;
let lhs = html.find(lhs_search).context("missing bmstable meta")?;
let html = &html[lhs + lhs_search.len()..];
let rhs = html.find('"').context("missing bmstable meta rhs")?;
Ok(&html[..rhs])
}
#[cfg(test)]
mod tests {
#[test]
fn test_extract_header_url() {
use super::extract_raw_header_url;
assert_eq!(
extract_raw_header_url(
r#"<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>
<meta name"blahblah" /><meta name="bmstable" content="header.json" />"#
)
.ok(),
Some("header.json")
);
assert_eq!(
extract_raw_header_url(r#"<meta name="bmstable" content="header.json"/>"#).ok(),
Some("header.json")
);
assert_eq!(
format!("{}", extract_raw_header_url("").unwrap_err()),
"missing bmstable meta"
);
assert_eq!(
format!(
"{}",
extract_raw_header_url(r#"<meta name="bmstable" content="header.json"#)
.unwrap_err()
),
"missing bmstable meta rhs"
);
assert_eq!(
format!(
"{}",
extract_raw_header_url(r#"<meta name="bmstable" content="header.json" />"#)
.unwrap_err()
),
"missing bmstable meta"
);
}
#[test]
fn test_json_table_header_score_url() {
use super::resolve_json_url;
assert_eq!(
resolve_json_url("https://stellabms.xyz/fr/table.html", "score.json").ok(),
Some("https://stellabms.xyz/fr/score.json".to_string())
);
assert_eq!(
resolve_json_url(
"http://flowermaster.web.fc2.com/lrnanido/gla/LN.html",
"http://flowermaster.web.fc2.com/lrnanido/gla/score.json"
)
.ok(),
Some("http://flowermaster.web.fc2.com/lrnanido/gla/score.json".to_string())
);
}
}