wasmer_sdk/package/
search.rs

1//! Search the Wasmer registry.
2
3use futures_util::StreamExt;
4use wasmer_backend_api::WasmerClient;
5
6pub use wasmer_backend_api::types::{
7    CountComparison, CountFilter, PackageOrderBy, PackagesFilter, SearchOrderSort,
8    SearchPackageVersion, SearchPublishDate,
9};
10
11/// Number of results fetched per registry request while paging.
12const PAGE_SIZE: i32 = 50;
13
14/// Options for [`search_packages`].
15#[derive(Debug, Clone, Default)]
16pub struct SearchOptions {
17    /// Free-text query. An empty string (or `"*"`) matches everything.
18    pub query: String,
19    /// Additional filters, such as owner, curated status or download count.
20    pub filter: PackagesFilter,
21    /// Maximum number of results to return. `None` fetches every match.
22    pub limit: Option<usize>,
23}
24
25/// Search the registry for packages.
26///
27/// Pages through the registry until `opts.limit` results have been collected
28/// (or all matching packages, if no limit is set).
29pub async fn search_packages(
30    client: &WasmerClient,
31    opts: SearchOptions,
32) -> Result<Vec<SearchPackageVersion>, anyhow::Error> {
33    let SearchOptions {
34        query,
35        filter,
36        limit,
37    } = opts;
38
39    let page_size = match limit {
40        Some(0) => return Ok(Vec::new()),
41        Some(l) => l.min(PAGE_SIZE as usize) as i32,
42        None => PAGE_SIZE,
43    };
44
45    let mut stream = Box::pin(wasmer_backend_api::query::fetch_all_matching_packages(
46        client,
47        query,
48        Some(filter),
49        page_size,
50    ));
51
52    let mut results = Vec::new();
53    while let Some(page) = stream.next().await {
54        results.extend(page?);
55        if let Some(limit) = limit
56            && results.len() >= limit
57        {
58            results.truncate(limit);
59            break;
60        }
61    }
62
63    Ok(results)
64}