pacbot/src/commands/pacman.rs

70 lines
1.7 KiB
Rust

use crate::commands::*;
use serde::Deserialize;
use serenity::model::channel::Message;
use std::fmt;
pub fn query_pacman(ctx: Context, msg: Message, args: Vec<&str>) {
if args.len() == 1 {
// try by full package name
let response: Response = search(
&format!(
"https://www.archlinux.org/packages/search/json/?name={}",
&args[0]
),
|_e| EMPTY_RESULT,
);
// this is 1 for most packages and 2 if there’s a second version in testing
if response.results.len() != 0 {
respond_with_results(msg.channel_id, &response.results, &ctx);
return;
}
}
let query = args.join(" ");
let response: Response = search(
&format!(
"https://www.archlinux.org/packages/search/json/?q={}",
&query
),
|_e| EMPTY_RESULT,
);
if response.results.is_empty() {
send(msg.channel_id, "No results", &ctx);
return;
}
respond_with_results(msg.channel_id, &response.results, &ctx);
}
const EMPTY_RESULT: Response = Response {
results: Vec::new(),
};
#[derive(Deserialize)]
struct Response {
results: Vec<Package>,
}
#[derive(Deserialize)]
struct Package {
pkgname: String,
//pkgbase: String,
repo: String,
pkgver: String,
pkgdesc: String,
//url: String,
//compressed_size: i64,
//installed_size: i64,
//build_date: String,
//last_update: String,
//flag_date: Option<String>,
}
impl fmt::Display for Package {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}/{} {}\n {}",
self.repo, self.pkgname, self.pkgver, self.pkgdesc
)
}
}