mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-11-06 13:14:21 +01:00
JsonConfig: refactor to get rid of data-ffjson_*
This commit is contained in:
@@ -1,71 +1,59 @@
|
||||
#include "modules/jsonconfig/jsonconfig.h"
|
||||
#include "common/config.h"
|
||||
#include "common/jsonconfig.h"
|
||||
#include "common/printing.h"
|
||||
|
||||
#ifdef FF_HAVE_JSONC
|
||||
|
||||
#include "common/io/io.h"
|
||||
#include "common/json.h"
|
||||
#include "modules/modules.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module)
|
||||
static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, json_object* module)
|
||||
{
|
||||
return
|
||||
ffParseTitleJsonObject(instance, type, data, module) ||
|
||||
ffParseBatteryJsonObject(instance, type, data, module) ||
|
||||
ffParseBiosJsonObject(instance, type, data, module) ||
|
||||
ffParseBluetoothJsonObject(instance, type, data, module) ||
|
||||
ffParseBoardJsonObject(instance, type, data, module) ||
|
||||
ffParseBreakJsonObject(instance, type, data, module) ||
|
||||
ffParseBrightnessJsonObject(instance, type, data, module) ||
|
||||
ffParseCommandJsonObject(instance, type, data, module) ||
|
||||
ffParseDateTimeJsonObject(instance, type, data, module) ||
|
||||
ffParseDisplayJsonObject(instance, type, data, module) ||
|
||||
ffParseHostJsonObject(instance, type, data, module) ||
|
||||
ffParseKernelJsonObject(instance, type, data, module) ||
|
||||
ffParseOSJsonObject(instance, type, data, module) ||
|
||||
ffParseSeparatorJsonObject(instance, type, data, module) ||
|
||||
ffParseTitleJsonObject(instance, type, module) ||
|
||||
ffParseBatteryJsonObject(instance, type, module) ||
|
||||
ffParseBiosJsonObject(instance, type, module) ||
|
||||
ffParseBluetoothJsonObject(instance, type, module) ||
|
||||
ffParseBoardJsonObject(instance, type, module) ||
|
||||
ffParseBreakJsonObject(instance, type, module) ||
|
||||
ffParseBrightnessJsonObject(instance, type, module) ||
|
||||
ffParseCommandJsonObject(instance, type, module) ||
|
||||
ffParseDateTimeJsonObject(instance, type, module) ||
|
||||
ffParseDisplayJsonObject(instance, type, module) ||
|
||||
ffParseHostJsonObject(instance, type, module) ||
|
||||
ffParseKernelJsonObject(instance, type, module) ||
|
||||
ffParseOSJsonObject(instance, type, module) ||
|
||||
ffParseSeparatorJsonObject(instance, type, module) ||
|
||||
false;
|
||||
}
|
||||
|
||||
typedef struct JsonConfigData
|
||||
static const char* parseModules(FFinstance* instance, json_object* modules)
|
||||
{
|
||||
JSONCData data;
|
||||
json_object* root;
|
||||
} JsonConfigData;
|
||||
|
||||
static inline void wrapJsoncFree(JsonConfigData* jsonConfig)
|
||||
{
|
||||
assert(jsonConfig);
|
||||
if (jsonConfig->root)
|
||||
jsonConfig->data.ffjson_object_put(jsonConfig->root);
|
||||
}
|
||||
|
||||
static const char* parseModules(FFinstance* instance, JSONCData* data, json_object* modules)
|
||||
{
|
||||
array_list* list = data->ffjson_object_get_array(modules);
|
||||
array_list* list = json_object_get_array(modules);
|
||||
if (!list) return "modules must be an array of strings or objects";
|
||||
|
||||
for (size_t idx = 0; idx < list->length; ++idx)
|
||||
{
|
||||
json_object* module = (json_object*) list->array[idx];
|
||||
const char* type = NULL;
|
||||
if (data->ffjson_object_is_type(module, json_type_string))
|
||||
if (json_object_is_type(module, json_type_string))
|
||||
{
|
||||
type = data->ffjson_object_get_string(module);
|
||||
type = json_object_get_string(module);
|
||||
module = NULL;
|
||||
}
|
||||
else if (data->ffjson_object_is_type(module, json_type_object))
|
||||
else if (json_object_is_type(module, json_type_object))
|
||||
{
|
||||
json_object* object = data->ffjson_object_object_get(module, "type");
|
||||
type = data->ffjson_object_get_string(object);
|
||||
json_object* object = json_object_object_get(module, "type");
|
||||
type = json_object_get_string(object);
|
||||
if (!type) return "module object must contain a type key";
|
||||
}
|
||||
else
|
||||
return "modules must be an array of strings or objects";
|
||||
|
||||
if(!parseModuleJsonObject(instance, type, data, module))
|
||||
if(!parseModuleJsonObject(instance, type, module))
|
||||
return "Unknown module type";
|
||||
}
|
||||
|
||||
@@ -74,26 +62,8 @@ static const char* parseModules(FFinstance* instance, JSONCData* data, json_obje
|
||||
|
||||
static const char* printJsonConfig(FFinstance* instance)
|
||||
{
|
||||
FF_LIBRARY_LOAD(libjsonc, &instance->config.libJSONC, "dlopen libjson-c" FF_LIBRARY_EXTENSION" failed",
|
||||
#ifdef _WIN32
|
||||
"libjson-c-5" FF_LIBRARY_EXTENSION, -1
|
||||
#else
|
||||
"libjson-c" FF_LIBRARY_EXTENSION, 5
|
||||
#endif
|
||||
)
|
||||
JsonConfigData __attribute__((__cleanup__(wrapJsoncFree))) jsonConfig = {};
|
||||
JSONCData* data = &jsonConfig.data;
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_tokener_parse)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_is_type)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_array)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_boolean)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_double)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_int)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_string_len)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_string)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_get_object)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_object_get)
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libjsonc, *data, json_object_put)
|
||||
if (!ffJsonLoadLibrary(instance))
|
||||
return "Failed to load json-c library";
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY content;
|
||||
ffStrbufInit(&content);
|
||||
@@ -106,11 +76,11 @@ static const char* printJsonConfig(FFinstance* instance)
|
||||
if (success) break;
|
||||
}
|
||||
|
||||
jsonConfig.root = data->ffjson_tokener_parse(content.chars);
|
||||
if (!jsonConfig.root)
|
||||
json_object* __attribute__((__cleanup__(wrapJsoncFree))) root = json_tokener_parse(content.chars);
|
||||
if (!root)
|
||||
return "Failed to parse JSON config file";
|
||||
|
||||
lh_table* rootObject = data->ffjson_object_get_object(jsonConfig.root);
|
||||
lh_table* rootObject = json_object_get_object(root);
|
||||
if (!rootObject)
|
||||
return "Invalid JSON config format. Root value must be an object";
|
||||
|
||||
@@ -118,11 +88,11 @@ static const char* printJsonConfig(FFinstance* instance)
|
||||
lh_foreach(rootObject, entry)
|
||||
{
|
||||
const char* key = (const char *)lh_entry_k(entry);
|
||||
json_object* val = (struct json_object *)lh_entry_v(entry);
|
||||
json_object* val = (json_object *)lh_entry_v(entry);
|
||||
|
||||
if (strcmp(key, "modules") == 0)
|
||||
{
|
||||
const char* error = parseModules(instance, data, val);
|
||||
const char* error = parseModules(instance, val);
|
||||
if (error) return error;
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user