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 { 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, } #[derive(Deserialize)] struct Version { area: String, suites: Vec, 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 ) } }