From 442e01c53f560d676c45fedea28b4b8f0826248d Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Wed, 22 Jun 2022 11:42:16 +0200 Subject: [PATCH] Initial commit & PoC --- .gitignore | 3 +++ README.md | 8 ++++++++ aur.v | 10 ++++++++++ client.v | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ request.v | 1 + search.v | 34 ++++++++++++++++++++++++++++++++++ v.mod | 7 +++++++ 7 files changed, 112 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 aur.v create mode 100644 client.v create mode 100644 request.v create mode 100644 search.v create mode 100644 v.mod diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9f152e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.so +main.v +vls.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..88be755 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# AUR + +This library provides a wrapper around the [aurweb RPC +interface](https://aur.archlinux.org/rpc). + +This library is largely inspired by +[raur](https://gitlab.com/davidbittner/raur); this is basically a re-write of +raur in V. diff --git a/aur.v b/aur.v new file mode 100644 index 0000000..008e982 --- /dev/null +++ b/aur.v @@ -0,0 +1,10 @@ +module aur + +const aur_rpc_url = 'https://aur.archlinux.org/rpc/' + +pub struct Package { +pub: + id u32 [json: ID] + name string [json: Name] + package_base_id u32 [json: PackageBaseID] +} diff --git a/client.v b/client.v new file mode 100644 index 0000000..9abfb32 --- /dev/null +++ b/client.v @@ -0,0 +1,49 @@ +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 params_escaped := map[string]string{} + + for k, v in params { + params_escaped[k] = urllib.query_escape(v) + } + + params_str := params_escaped.keys().map('$it=${params[it]}').join('&') + + url := '$c.url?$params_str' + + 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 +} diff --git a/request.v b/request.v new file mode 100644 index 0000000..d60e101 --- /dev/null +++ b/request.v @@ -0,0 +1 @@ +module aur diff --git a/search.v b/search.v new file mode 100644 index 0000000..4bc65a9 --- /dev/null +++ b/search.v @@ -0,0 +1,34 @@ +module aur + +pub enum SearchType { + name + name_desc + maintainer + depends + make_depends + opt_depends + check_depends +} + +pub fn (st SearchType) str() string { + return match st { + .name { 'name' } + .name_desc { 'name-desc' } + .maintainer { 'maintainer' } + .depends { 'depends' } + .make_depends { 'makedepends' } + .opt_depends { 'optdepends' } + .check_depends { 'checkdepends' } + } +} + +pub fn (c Client) search_by(arg string, st SearchType) ?[]Package { + params := { + 'v': '5' + 'type': 'search' + 'by': '$st' + 'arg': arg + } + + return c.request(params) +} diff --git a/v.mod b/v.mod new file mode 100644 index 0000000..5e73638 --- /dev/null +++ b/v.mod @@ -0,0 +1,7 @@ +Module { + name: 'aur' + description: 'Library for interacting with the AUR RPC interface' + version: '0.0.0' + license: 'MIT' + dependencies: [] +}