path: root/aports/dump.lua
blob: a78b63e2b97bb9325261d66eeb0060f3dcbf436e (plain) (tree)

-- Dump packages info into JSON.
local cjson = require('cjson')
local pkgmod = require('aports.pkg')

local get_maintainer = pkgmod.get_maintainer
local push = table.insert

-- Tables with this metatable are encoded as an array by our patched cjson.
local empty_array_mt = { __name = 'array' }

local empty_array = setmetatable({}, empty_array_mt)

--- Converts pkg's `arch` map into list of architectures.
-- Negated architecture is prefixed by "!".
-- @tparam {[string]=bool,...} arch
-- @treturn {string,...}
local function convert_arch(arch)
	local t = {}
	for name, value in pairs(arch) do
		push(t, value and name or '!'
	return t

--- "Marks" the given table to be encoded as a JSON array.
local function array(tab)
	return #tab == 0
		and empty_array
		or setmetatable(tab, empty_array_mt)

--- Converts the `pkg` into a simple table (map) that can be serialized.
-- @tparam table pkg The package table (see @{db.split_apkbuild}).
-- @treturn table A simple map of values.
local function pkg_to_table(pkg)
	return {
		pkgname = pkg.pkgname,
		pkgver = pkg.pkgver,
		pkgrel = tonumber(pkg.pkgrel),
		pkgdesc = pkg.pkgdesc,
		url = pkg.url,
		license = pkg.license,
		arch = array(convert_arch(pkg.arch)),
		depends = array(pkg.depends),
		makedepends = array(pkg.makedepends),
		checkdepends = array(pkg.checkdepends),
		subpackages = array(pkg.subpackages),
		source = array(pkg.source),
		maintainer = get_maintainer(pkg),

local M = {}

--- Dumps packages from the given iterator to a map indexed by package name.
function M.pkgs_to_map(iter, state)
	local t = {}
	for pkg in iter, state do
		t[pkg.pkgname] = pkg_to_table(pkg)
	return t

--- Dumps packages from the given iterator to JSON.
-- @see pkgs_to_map
function M.pkgs_to_json(iter, state)
	cjson.encode_sort_keys = true
	return cjson.encode(M.pkgs_to_map(iter, state))

return M