JSON-сериализация
Модуль apg/json.h отвечает за чтение метаданных из meta.json и сериализацию объектов пакетов. Использует библиотеку yyjson — быстрый C-парсер JSON.
Чтение метаданных
package_metadata_from_file
struct package_metadata *package_metadata_from_file(const char *path);
Загружает и разбирает файл meta.json по указанному пути.
struct package_metadata *meta =
package_metadata_from_file("/tmp/apg/extracted/meta.json");
if (meta) {
printf("%s %s\n", meta->name, meta->version);
package_metadata_free(meta);
}
package_metadata_from_json
struct package_metadata *package_metadata_from_json(const char *json, size_t len);
Разбирает метаданные из строки JSON заданной длины. Удобно когда JSON уже загружен в память.
const char *raw = "{\"package\":{\"name\":\"curl\",\"version\":\"8.0.0\",...}}";
struct package_metadata *meta =
package_metadata_from_json(raw, strlen(raw));
Сериализация
package_to_json
char *package_to_json(struct package *pkg);
Сериализует пакет в JSON-строку. Используется внутри add_package перед записью в LMDB.
Возвращает heap-allocated строку — освобождать через free. Возвращает NULL при ошибке.
char *json = package_to_json(pkg);
if (json) {
puts(json);
free(json);
}
Формат meta.json
{
"package": {
"name": "curl",
"version": "8.4.0",
"release": "1",
"architecture": "x86_64",
"description": "Command line tool for transferring data with URLs",
"maintainer": "NurOS Team <team@nuros.org>",
"license": "MIT",
"homepage": "https://curl.se",
"dependencies": ["libssl", "zlib"],
"conflicts": [],
"provides": ["curl"],
"replaces": [],
"tags": ["network", "cli"],
"conf": ["/etc/curl/curlrc"]
}
}