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}