docterm 0.2.0

A TUI-first documentation browser for Dash/Zeal docsets, optimized for the terminal.
use crate::model::{DocsetEntry, SourceList};

/// The bundled Kapeli source list, generated by `docterm-tool` from the feed XML files.
const KAPELI_TOML: &str = include_str!("../../kapeli.toml");

/// Return the full list of available docsets from the bundled `kapeli.toml`.
pub fn load_source_list() -> Vec<DocsetEntry> {
    let list: SourceList =
        toml::from_str(KAPELI_TOML).expect("embedded kapeli.toml must be valid TOML");
    list.source
}

/// Find a docset entry by name (case-insensitive).
pub fn find_entry(name: &str) -> Option<DocsetEntry> {
    load_source_list()
        .into_iter()
        .find(|e| e.name.eq_ignore_ascii_case(name))
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn source_list_is_non_empty() {
        let entries = load_source_list();
        assert!(
            !entries.is_empty(),
            "embedded kapeli.toml must contain entries"
        );
    }

    #[test]
    fn find_entry_known_docset() {
        let entry = find_entry("Rust").expect("Rust must be present in kapeli.toml");
        assert_eq!(entry.name, "Rust");
        assert!(!entry.version.is_empty());
        assert!(!entry.urls.is_empty());
        assert!(entry.urls[0].ends_with(".tgz"));
    }

    #[test]
    fn find_entry_case_insensitive() {
        let lower = find_entry("rust");
        let upper = find_entry("RUST");
        assert!(lower.is_some());
        assert!(upper.is_some());
        assert_eq!(lower.unwrap().name, upper.unwrap().name);
    }

    #[test]
    fn find_entry_unknown_returns_none() {
        assert!(find_entry("__nonexistent_docset__").is_none());
    }
}