aur_rpc/rpcs/
search.rs

1use crate::{error::RPCResult, models::PackageMetadata};
2
3/// Searches for packages by name
4pub async fn search<S: AsRef<str>>(keywords: S) -> RPCResult<Vec<PackageMetadata>> {
5    search_by(SearchField::Name, keywords).await
6}
7
8/// Searches for packages by a specific field
9pub async fn search_by<S: AsRef<str>>(
10    field: SearchField,
11    keywords: S,
12) -> RPCResult<Vec<PackageMetadata>> {
13    let args: Vec<(&str, &str)> = vec![
14        ("v", "5"),
15        ("type", "search"),
16        ("by", field.to_string()),
17        ("arg", keywords.as_ref()),
18    ];
19    let response = super::call_aur::<_, PackageMetadata>(&args).await?;
20
21    Ok(response.results)
22}
23
24/// Represents a field to search by
25#[derive(Debug, Clone, Copy)]
26pub enum SearchField {
27    /// Searches by name
28    Name,
29    /// Searches name and description
30    NameDesc,
31    /// Searches by package maintainer
32    Maintainer,
33    /// Searches for packages that depend on the given keywords
34    Depends,
35    /// Searches for packages that require the given keywords to be build
36    MakeDepends,
37    /// Searches for packages that optionally depend on the given keywords
38    OptDepends,
39    /// Searches for packages that require the given keywords to be present
40    CheckDepends,
41}
42
43impl SearchField {
44    pub(crate) fn to_string(&self) -> &'static str {
45        match self {
46            SearchField::Name => "name",
47            SearchField::NameDesc => "name-desc",
48            SearchField::Maintainer => "maintainer",
49            SearchField::Depends => "depends",
50            SearchField::MakeDepends => "makedepends",
51            SearchField::OptDepends => "optdepends",
52            SearchField::CheckDepends => "checkdepends",
53        }
54    }
55}