pacbot/src/commands/apt.rs
2019-10-31 11:45:16 +01:00

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
)
}
}