aur_rpc/
models.rs

1use serde::{Deserialize, Serialize};
2
3/// Represents the basic information about a package
4/// that can be retrieved from a search or by
5/// fetching the package info.
6#[derive(Clone, Debug, Deserialize)]
7#[serde(rename_all = "PascalCase")]
8pub struct PackageMetadata {
9    pub description: Option<String>,
10    pub first_submitted: u64,
11    #[serde(alias = "ID")]
12    pub id: u32,
13    pub last_modified: u64,
14    pub maintainer: Option<String>,
15    pub name: String,
16    pub num_votes: u32,
17    pub out_of_date: Option<u64>,
18    pub package_base: String,
19    #[serde(alias = "PackageBaseID")]
20    pub package_base_id: u32,
21    pub popularity: f64,
22    #[serde(alias = "URL")]
23    pub url: Option<String>,
24    #[serde(alias = "URLPath")]
25    pub url_path: String,
26    pub version: String,
27}
28
29/// Represents the information about a package that can
30/// be retrieved with the info rpc
31#[derive(Clone, Debug, Deserialize)]
32#[serde(from = "PackageInfoRaw")]
33pub struct PackageInfo {
34    pub metadata: PackageMetadata,
35    pub keywords: Vec<String>,
36    pub license: Vec<String>,
37    pub depends: Vec<String>,
38    pub make_depends: Vec<String>,
39    pub opt_depends: Vec<String>,
40    pub check_depends: Vec<String>
41}
42
43impl From<PackageInfoRaw> for PackageInfo {
44    fn from(info: PackageInfoRaw) -> Self {
45        PackageInfo {
46            metadata: PackageMetadata {
47                description: info.description,
48                first_submitted: info.first_submitted,
49                id: info.id,
50                last_modified: info.last_modified,
51                maintainer: info.maintainer,
52                name: info.name,
53                num_votes: info.num_votes,
54                out_of_date: info.out_of_date,
55                package_base: info.package_base,
56                package_base_id: info.package_base_id,
57                popularity: info.popularity,
58                url: info.url,
59                url_path: info.url_path,
60                version: info.version,
61            },
62            keywords: info.keywords,
63            license: info.license,
64            depends: info.depends,
65            opt_depends: info.opt_depends,
66            make_depends: info.make_depends,
67            check_depends: info.check_depends,
68        }
69    }
70}
71
72/// Full package info with all fields as a workaround
73/// as serde doesn't support aliases in flattened structs
74#[derive(Clone, Debug, Deserialize)]
75#[serde(rename_all = "PascalCase")]
76pub(crate) struct PackageInfoRaw {
77    pub keywords: Vec<String>,
78    pub license: Vec<String>,
79    #[serde(default)]
80    pub depends: Vec<String>,
81    #[serde(default)]
82    pub opt_depends: Vec<String>,
83    #[serde(default)]
84    pub check_depends: Vec<String>,
85    #[serde(default)]
86    pub make_depends: Vec<String>,
87    pub description: Option<String>,
88    pub first_submitted: u64,
89    #[serde(alias = "ID")]
90    pub id: u32,
91    pub last_modified: u64,
92    pub maintainer: Option<String>,
93    pub name: String,
94    pub num_votes: u32,
95    pub out_of_date: Option<u64>,
96    pub package_base: String,
97    #[serde(alias = "PackageBaseID")]
98    pub package_base_id: u32,
99    pub popularity: f64,
100    #[serde(alias = "URL")]
101    pub url: Option<String>,
102    #[serde(alias = "URLPath")]
103    pub url_path: String,
104    pub version: String,
105}
106
107/// Represents a basic AUR response
108#[derive(Clone, Debug, Serialize, Deserialize)]
109pub(crate) struct AURResponse<T> {
110    pub version: u8,
111    #[serde(alias = "type")]
112    pub response_type: ResponseType,
113    pub resultcount: u32,
114    pub results: Vec<T>,
115    #[serde(default)]
116    pub error: Option<String>,
117}
118
119/// Represents the type of AUR response
120#[derive(Clone, Debug, Serialize, Deserialize)]
121#[serde(rename_all = "lowercase")]
122pub(crate) enum ResponseType {
123    Error,
124    Search,
125    Info,
126    Multiinfo,
127}