Skip to main content

aur_client_fork/
aur.rs

1use reqwest::{self, Url};
2use serde::Deserialize;
3
4use std::error::Error;
5
6static AUR_URL: &str = "https://aur.archlinux.org/";
7static AUR_RPC_VER: &str = "5";
8
9lazy_static! {
10    static ref AUR_RPC_URL: String = Url::parse(AUR_URL)
11        .unwrap()
12        .join("/rpc")
13        .unwrap()
14        .to_string();
15    static ref AUR_GIT_URL: Url = Url::parse(AUR_URL).unwrap();
16}
17
18#[allow(non_snake_case)]
19#[derive(Debug, Default, Deserialize)]
20pub struct Package {
21    pub ID: i32,
22    pub Name: String,
23    pub PackageBaseID: i32,
24    pub PackageBase: Option<String>,
25    pub Version: String,
26    pub Description: Option<String>,
27    pub URL: Option<String>,
28    pub NumVotes: i32,
29    pub Popularity: f64,
30    pub OutOfDate: Option<i32>,
31    pub Maintainer: Option<String>,
32    pub FirstSubmitted: i32,
33    pub LastModified: i32,
34    pub URLPath: String,
35    pub Depends: Option<Vec<String>>,
36    pub MakeDepends: Option<Vec<String>>,
37    pub CheckDepends: Option<Vec<String>>,
38    pub Conflicts: Option<Vec<String>>,
39    pub Provides: Option<Vec<String>>,
40    pub Replaces: Option<Vec<String>>,
41    pub OptDepends: Option<Vec<String>>,
42    pub Groups: Option<Vec<String>>,
43    pub License: Option<Vec<String>>,
44    pub Keywords: Option<Vec<String>>,
45}
46
47#[derive(Deserialize)]
48pub struct Response {
49    pub error: Option<String>,
50    pub version: i32,
51    pub r#type: String,
52    pub resultcount: i32,
53    pub results: Vec<Package>,
54}
55
56pub async fn search(arg: &str) -> Result<Response, Box<dyn Error>> {
57    let url = Url::parse_with_params(
58        &AUR_RPC_URL,
59        &[("v", AUR_RPC_VER), ("type", "search"), ("arg", arg)],
60    )?;
61
62    let client = reqwest::Client::new();
63    let resp: Response = client.get(url.as_str()).send().await?.json().await?;
64    Ok(resp)
65}
66
67pub async fn info(needles: &[&str]) -> Result<Response, Box<dyn Error>> {
68    let mut args = Vec::new();
69    args.push(("v", AUR_RPC_VER));
70    args.push(("type", "info"));
71    for n in needles {
72        args.push(("arg[]", n));
73    }
74
75    let url = Url::parse_with_params(&AUR_RPC_URL, &args)?;
76
77    let client = reqwest::Client::new();
78    let resp: Response = client.get(url.as_str()).send().await?.json().await?;
79    Ok(resp)
80}
81
82pub fn get_git_url(package: &str) -> String {
83    AUR_GIT_URL
84        .join(package)
85        .unwrap()
86        .join(".git")
87        .unwrap()
88        .to_string()
89}