2019-10-30 23:00:51 +01:00
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 ) ,
2019-10-31 10:39:28 +01:00
| _e | EMPTY_RESULT ,
2019-10-30 23:00:51 +01:00
) ;
2019-10-31 11:45:16 +01:00
if response . versions . is_empty ( ) {
2019-10-30 23:00:51 +01:00
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 ( ) ,
2019-10-31 11:45:16 +01:00
suite ,
2019-10-30 23:00:51 +01:00
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
)
}
}