wasmer_sdk/package/
search.rs1use 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
11const PAGE_SIZE: i32 = 50;
13
14#[derive(Debug, Clone, Default)]
16pub struct SearchOptions {
17 pub query: String,
19 pub filter: PackagesFilter,
21 pub limit: Option<usize>,
23}
24
25pub 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}