ayy/main.v
2022-01-31 15:31:02 +01:00

163 lines
3.6 KiB
V

import os
import net.http
import json
import cli
const mpr_url = 'https://mpr.makedeb.org/'
fn main() {
mut app := cli.Command{
name: 'ayy'
description: 'A simple MPR helper'
commands: [
cli.Command{
name: 'install'
usage: '[package name]'
description: 'Install packages'
execute: install
},
cli.Command{
name: 'search'
usage: '[package name]'
description: 'Search for packages'
execute: search
required_args: 1
},
]
}
app.setup()
app.parse(os.args)
}
fn get_pkg_data(pkg_name string) Rpc_resp {
// resp := http.get('$mpr_url/rpc?v=5&type=info&arg[]=$pkg_name') or {
// println(err)
// exit(1)
// }
resp := http.get('https://vps.anotherfoxguy.com/dl/sw.json') or {
println(err)
exit(1)
}
data := json.decode(Rpc_resp, resp.text) or {
println('Failed to parse data: $err')
exit(1)
}
return data
}
fn install(cmd cli.Command) ? {
mut deps := map[string]Dependency{}
for pkg_name in cmd.args {
data := get_pkg_data(pkg_name)
if data.resultcount != 1 {
println('Package $pkg_name not found on MPR')
exit(1)
}
pkg := data.results[0]
collect_deps(pkg.depends, mut deps)
collect_deps(pkg.make_depends, mut deps)
for _, dat in deps {
match dat.source {
.apt { install_apt_package(dat.name) }
.mpr { install_mpr_package(dat.name) }
}
}
}
}
fn install_mpr_package(package string) {
exe := os.execute('apt install -y $package')
if apt_search.exit_code != 0 {
println('Warn: $package not found on MPR or apt!!')
exit(1)
}
}
fn install_apt_package(package string) {
exe := os.execute('apt install -y $package')
if apt_search.exit_code != 0 {
println('Warn: $package not found on MPR or apt!!')
exit(1)
}
}
fn collect_deps(deps []string, mut result map[string]Dependency) {
for dep in deps {
if dep in result {
return
}
ddata := get_pkg_data(dep)
if ddata.resultcount == 1 {
result[dep] = Dependency{dep, Source.mpr}
} else {
apt_search := os.execute('apt-cache show $dep')
if apt_search.exit_code != 0 {
println('Warn: $dep not found on MPR or apt!!')
return
}
println('aaaaa $apt_search')
result[dep] = Dependency{dep, Source.apt}
}
}
}
fn search(cmd cli.Command) ? {
pkg := cmd.args[0]
resp := http.get('$mpr_url/rpc?v=5&type=search&arg=$pkg') or {
println(err)
exit(1)
}
data := json.decode(Rpc_resp, resp.text) ?
println('Packages found $data.resultcount')
for res in data.results {
println('\t Name: $res.name')
println('\t Description: $res.description')
}
}
enum Source {
mpr
apt
}
struct Dependency {
name string
source Source
}
struct Rpc_resp {
resultcount int
results []Package
version int
}
struct Package {
conflicts []string [json: Conflicts]
depends []string [json: Depends]
make_depends []string [json: MakeDepends]
description string [json: Description]
first_submitted int [json: FirstSubmitted]
id int [json: ID]
keywords []string [json: Keywords]
lastmodified int [json: LastModified]
license []string [json: License]
maintainer string [json: Maintainer]
name string [json: Name]
num_votes int [json: NumVotes]
out_of_date string [json: OutOfDate]
package_base string [json: PackageBase]
package_base_id int [json: PackageBaseID]
popularity int [json: Popularity]
provides []string [json: Provides]
replaces []string [json: Replaces]
url string [json: URL]
url_path string [json: URLPath]
version string [json: Version]
}