winbrew_cli\commands/
search.rs1use 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}