winbrew_cli\commands/
search.rs

1//! Search command wrapper for catalog queries.
2//!
3//! The wrapper handles catalog-unavailable fallback text, empty-state output,
4//! and the final result count for package searches.
5
6use anyhow::Result;
7use std::io::Write;
8
9use crate::{CommandContext, app::search};
10use winbrew_ui::Ui;
11
12pub fn run(ctx: &CommandContext, query: &[String]) -> Result<()> {
13    let mut ui = ctx.ui();
14    run_with_ui(&mut ui, query)
15}
16
17fn run_with_ui<W: Write>(ui: &mut Ui<W>, query: &[String]) -> Result<()> {
18    ui.page_title("Package Catalog");
19
20    let query_text = query.join(" ");
21
22    let packages = match search::search_packages(&query_text) {
23        Ok(packages) => packages,
24        Err(search::SearchError::CatalogUnavailable) => {
25            ui.notice("Package catalog not available. Run `winbrew update` first.");
26            return Ok(());
27        }
28        Err(search::SearchError::Unexpected(err)) => return Err(err),
29    };
30
31    if packages.is_empty() {
32        ui.notice(format!("No catalog packages matching '{query_text}'."));
33        return Ok(());
34    }
35
36    ui.display_catalog_packages(&packages);
37    ui.info(format!("\nTotal: {} package(s) found.", packages.len()));
38
39    Ok(())
40}
41
42#[cfg(test)]
43mod tests {
44    use super::run_with_ui;
45    use crate::commands::test_support::{buffer_text, buffered_ui};
46    use crate::database::{self, Config};
47    use tempfile::tempdir;
48    use winbrew_ui::UiSettings;
49
50    #[test]
51    fn run_with_ui_reports_catalog_unavailable() {
52        let temp_dir = tempdir().expect("temp dir");
53        let config = Config::load_at(temp_dir.path()).expect("config should load");
54        database::init(&config.resolved_paths()).expect("database should initialize");
55
56        let (mut ui, out, err) = buffered_ui(UiSettings::default());
57        let query = ["contoso".to_string()];
58
59        run_with_ui(&mut ui, &query).expect("search should succeed");
60
61        assert!(buffer_text(&out).trim().is_empty());
62        assert!(
63            buffer_text(&err)
64                .contains("Package catalog not available. Run `winbrew update` first.")
65        );
66    }
67}