aur/client.v

78 lines
1.3 KiB
V

module aur
import net.urllib
import net.http
import json
pub struct Client {
url string = aur_rpc_url
}
pub fn new() &Client {
return &Client{}
}
pub fn new_with_url(url string) &Client {
if !url.ends_with('/') {
return &Client{
url: '$url/'
}
}
return &Client{
url: url
}
}
struct SuccessResponse {
result_count int [json: resultCount]
results []Package
}
fn (c Client) request(params map[string][]string) ?[]Package {
mut param_strings := []string{}
for k, v in params {
param_strings << v.map(urllib.query_escape(it)).map('$k=$it')
}
url := '$c.url?${param_strings.join('&')}'
res := http.get(url)?
if res.status_code < 200 || res.status_code >= 300 {
// temporary
return error('error')
}
data := json.decode(SuccessResponse, res.body)?
return data.results
}
pub fn (c Client) search_by(arg string, st SearchType) ?[]Package {
params := {
'v': ['5']
'type': ['search']
'by': ['$st']
'arg': [arg]
}
return c.request(params)
}
// search performs a search by name_desc.
pub fn (c Client) search(arg string) ?[]Package {
return c.search_by(arg, .name_desc)
}
pub fn (c Client) info(pkgs []string) ?[]Package {
params := {
'v': ['5']
'type': ['info']
'arg[]': pkgs
}
return c.request(params)
}