winbrew_app\operations/
search.rs

1//! App-facing search facade over the catalog search.
2//!
3//! This module keeps the command boundary stable while the catalog layer
4//! owns the actual search error semantics.
5
6use crate::catalog;
7use crate::database;
8use crate::models::domains::catalog::CatalogPackage;
9use anyhow::Error;
10
11#[derive(Debug)]
12pub enum SearchError {
13    CatalogUnavailable,
14    Unexpected(Error),
15}
16
17pub type SearchResult<T> = std::result::Result<T, SearchError>;
18
19pub fn search_packages(query: &str) -> SearchResult<Vec<CatalogPackage>> {
20    match catalog::search_packages(query) {
21        Ok(packages) => Ok(packages),
22        Err(err)
23            if err
24                .downcast_ref::<database::CatalogNotFoundError>()
25                .is_some() =>
26        {
27            Err(SearchError::CatalogUnavailable)
28        }
29        Err(err) => Err(SearchError::Unexpected(err)),
30    }
31}