69 lines
1.6 KiB
Rust
69 lines
1.6 KiB
Rust
use crate::commands::*;
|
|
use serde::Deserialize;
|
|
use serenity::model::channel::Message;
|
|
use std::fmt;
|
|
|
|
pub fn query_apt(ctx: Context, msg: Message, args: Vec<&str>) {
|
|
let query = args.join(" ");
|
|
let response: Response = search(
|
|
&format!("https://sources.debian.org/api/src/{}/", &query),
|
|
|_e| EMPTY_RESULT,
|
|
);
|
|
if response.versions.is_empty() {
|
|
send(msg.channel_id, "No results", &ctx);
|
|
return;
|
|
}
|
|
let packages = convert_versions(response);
|
|
respond_with_results(msg.channel_id, &packages, &ctx);
|
|
}
|
|
|
|
fn convert_versions(res: Response) -> Vec<Package> {
|
|
let mut packages = Vec::new();
|
|
for version in res.versions {
|
|
for suite in version.suites {
|
|
packages.push(Package {
|
|
area: version.area.clone(),
|
|
name: res.package.clone(),
|
|
suite,
|
|
version: version.version.clone(),
|
|
});
|
|
}
|
|
}
|
|
packages
|
|
}
|
|
|
|
const EMPTY_RESULT: Response = Response {
|
|
package: String::new(),
|
|
versions: Vec::new(),
|
|
};
|
|
|
|
#[derive(Deserialize)]
|
|
struct Response {
|
|
package: String,
|
|
versions: Vec<Version>,
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
struct Version {
|
|
area: String,
|
|
suites: Vec<String>,
|
|
version: String,
|
|
}
|
|
|
|
struct Package {
|
|
area: String,
|
|
name: String,
|
|
suite: String,
|
|
version: String,
|
|
}
|
|
|
|
impl fmt::Display for Package {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(
|
|
f,
|
|
"{}/{} {} ({})",
|
|
self.area, self.name, self.version, self.suite
|
|
)
|
|
}
|
|
}
|