lr2-oxytabler 0.2.1

Table manager for Lunatic Rave 2
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"
        );

        // 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 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())
        );

        // idc
    }
}