lr2-oxytabler 0.5.0

Table manager for Lunatic Rave 2
use anyhow::{Context, Result};

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 {
    use test_log::test;

    #[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"
        );

        // In practice, looks like it's fair to check for literal match like we do, instead of
        // parsing.
        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 crate::ResolvedUrl;

        assert_eq!(
            ResolvedUrl::try_from("https://stellabms.xyz/fr/table.html")
                .unwrap()
                .resolve_json_url("score.json")
                .ok()
                .map(|url| url.0)
                .as_deref(),
            Some("https://stellabms.xyz/fr/score.json")
        );

        assert_eq!(
            ResolvedUrl::try_from("http://flowermaster.web.fc2.com/lrnanido/gla/LN.html")
                .unwrap()
                .resolve_json_url("http://flowermaster.web.fc2.com/lrnanido/gla/score.json")
                .ok()
                .map(|url| url.0)
                .as_deref(),
            Some("http://flowermaster.web.fc2.com/lrnanido/gla/score.json")
        );

        // idc
    }
}