master ohmu/fastfetch-openbsd / src / modules / logo / logo.c
ohmu  ·  2026-10-15
  1#include "common/printing.h"
  2#include "logo/logo.h"
  3#include "modules/logo/logo.h"
  4#include "options/logo.h"
  5
  6bool ffPrintLogo([[maybe_unused]] FFLogoOptions* options) {
  7    ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Logo), 0, nullptr, FF_PRINT_TYPE_DEFAULT, "Supported in JSON format only");
  8    return false;
  9}
 10
 11void ffParseLogoJsonObject([[maybe_unused]] FFLogoOptions* options, [[maybe_unused]] yyjson_val* module) {
 12    yyjson_val *key, *val;
 13    size_t idx, max;
 14    yyjson_obj_foreach (module, idx, max, key, val) {
 15        if (unsafe_yyjson_equals_str(key, "type") || unsafe_yyjson_equals_str(key, "condition")) {
 16            continue;
 17        }
 18
 19        ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Logo), 0, nullptr, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
 20    }
 21}
 22
 23bool ffGenerateLogoJsonResult([[maybe_unused]] FFLogoOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
 24    FFLogoSize size = FF_LOGO_SIZE_UNKNOWN;
 25    FFOptionsLogo* logoOptions = &instance.config.logo;
 26    if (logoOptions->type == FF_LOGO_TYPE_SMALL) {
 27        size = FF_LOGO_SIZE_SMALL;
 28    } else if (logoOptions->type != FF_LOGO_TYPE_BUILTIN && logoOptions->type != FF_LOGO_TYPE_AUTO) {
 29        yyjson_mut_obj_add_str(doc, module, "error", "Only 'builtin' and 'small' logo types are supported");
 30        return false;
 31    }
 32
 33    const FFlogo* logo = logoOptions->source.length > 0
 34        ? ffLogoGetBuiltinForName(&logoOptions->source, size)
 35        : ffLogoGetBuiltinDetected(size);
 36
 37    if (!logo) {
 38        yyjson_mut_obj_add_str(doc, module, "error", "No built-in logo found for the specified name/size");
 39        return false;
 40    }
 41
 42    yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
 43
 44    yyjson_mut_obj_add_str(doc, obj, "lines", logo->lines);
 45
 46    yyjson_mut_val* namesArr = yyjson_mut_obj_add_arr(doc, obj, "names");
 47    for (size_t i = 0; i < FASTFETCH_LOGO_MAX_NAMES && logo->names[i]; i++) {
 48        yyjson_mut_arr_add_str(doc, namesArr, logo->names[i]);
 49    }
 50
 51    yyjson_mut_val* colorsArr = yyjson_mut_obj_add_arr(doc, obj, "colors");
 52    for (size_t i = 0; i < FASTFETCH_LOGO_MAX_COLORS && logo->colors[i]; i++) {
 53        yyjson_mut_arr_add_str(doc, colorsArr, logo->colors[i]);
 54    }
 55
 56    yyjson_mut_obj_add_str(doc, obj, "colorKeys", logo->colorKeys);
 57    yyjson_mut_obj_add_str(doc, obj, "colorTitle", logo->colorTitle);
 58
 59    yyjson_mut_val* typeArr = yyjson_mut_obj_add_arr(doc, obj, "type");
 60    // `FF_LOGO_LINE_TYPE_NORMAL` is 0, so a bit test here is always false and "normal" would be dead
 61    // code. `src/logo/logo.c` tests the same flag with `!=`, which is the intended semantics.
 62    if (logo->type == FF_LOGO_LINE_TYPE_NORMAL) {
 63        yyjson_mut_arr_add_str(doc, typeArr, "normal");
 64    }
 65    if (logo->type & FF_LOGO_LINE_TYPE_SMALL_BIT) {
 66        yyjson_mut_arr_add_str(doc, typeArr, "small");
 67    }
 68    if (logo->type & FF_LOGO_LINE_TYPE_ALTER_BIT) {
 69        yyjson_mut_arr_add_str(doc, typeArr, "alter");
 70    }
 71
 72    return true;
 73}
 74
 75void ffInitLogoOptions([[maybe_unused]] FFLogoOptions* options) {
 76}
 77
 78void ffDestroyLogoOptions([[maybe_unused]] FFLogoOptions* options) {
 79}
 80
 81FFModuleBaseInfo ffLogoModuleInfo = {
 82    .name = "Logo",
 83    .description = "Query built-in logo for JSON output",
 84    .displayName = {
 85        .en = "Logo",
 86        .ar = "الشعار",
 87        .cs = "Logo",
 88        .de = "Logo",
 89        .es = "Logo",
 90        .fi = "Logo",
 91        .fr = "Logo",
 92        .gl = "Logo",
 93        .he = "לוגו",
 94        .id = "Logo",
 95        .it = "Logo",
 96        .ja = "ロゴ",
 97        .ko = "로고",
 98        .pl = "Logo",
 99        .pt = "Logo",
100        .ru = "Логотип",
101        .tr = "Logo",
102        .uk = "Логотип",
103        .vi = "Logo",
104        .zh_CN = "徽标",
105        .zh_TW = "標誌",
106    },
107    .initOptions = (void*) ffInitLogoOptions,
108    .destroyOptions = (void*) ffDestroyLogoOptions,
109    .parseJsonObject = (void*) ffParseLogoJsonObject,
110    .printModule = (void*) ffPrintLogo,
111    .generateJsonResult = (void*) ffGenerateLogoJsonResult,
112};