Files
fastfetch/src/common/commandoption.c
T

185 lines
6.1 KiB
C
Raw Normal View History

#include "commandoption.h"
2023-08-29 11:13:55 +08:00
#include "common/printing.h"
#include "common/time.h"
#include "common/jsonconfig.h"
2023-08-29 11:13:55 +08:00
#include "fastfetch_datatext.h"
#include "modules/modules.h"
#include "util/stringUtils.h"
#include <ctype.h>
2023-08-29 11:13:55 +08:00
#include <inttypes.h>
bool ffParseModuleOptions(const char* key, const char* value)
{
2023-08-20 21:35:38 +08:00
if (!ffStrStartsWith(key, "--") || !isalpha(key[2])) return false;
2023-08-20 21:35:38 +08:00
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(key[2]) - 'A']; *modules; ++modules)
{
2023-08-20 21:35:38 +08:00
FFModuleBaseInfo* baseInfo = *modules;
if (baseInfo->parseCommandOptions(baseInfo, key, value)) return true;
}
2023-08-20 21:35:38 +08:00
return false;
}
2023-08-29 11:13:55 +08:00
void ffPrepareCommandOption(FFdata* data)
{
2023-10-25 15:38:46 +08:00
FFOptionsModules* const options = &instance.config.modules;
2023-08-29 11:13:55 +08:00
//If we don't have a custom structure, use the default one
if(data->structure.length == 0)
ffStrbufAppendS(&data->structure, FASTFETCH_DATATEXT_STRUCTURE);
if(ffStrbufContainIgnCaseS(&data->structure, FF_CPUUSAGE_MODULE_NAME))
ffPrepareCPUUsage();
2023-10-08 16:30:09 +08:00
if(ffStrbufContainIgnCaseS(&data->structure, FF_DISKIO_MODULE_NAME))
2023-10-25 15:38:46 +08:00
ffPrepareDiskIO(&options->diskIo);
2023-10-08 16:30:09 +08:00
2023-09-27 00:05:37 +08:00
if(ffStrbufContainIgnCaseS(&data->structure, FF_NETIO_MODULE_NAME))
2023-10-25 15:38:46 +08:00
ffPrepareNetIO(&options->netIo);
2023-09-26 16:26:15 +08:00
if(instance.config.general.multithreading)
2023-08-29 11:13:55 +08:00
{
if(ffStrbufContainIgnCaseS(&data->structure, FF_PUBLICIP_MODULE_NAME))
2023-10-25 15:38:46 +08:00
ffPreparePublicIp(&options->publicIP);
2023-08-29 11:13:55 +08:00
if(ffStrbufContainIgnCaseS(&data->structure, FF_WEATHER_MODULE_NAME))
2023-10-25 15:38:46 +08:00
ffPrepareWeather(&options->weather);
2023-08-29 11:13:55 +08:00
}
}
2023-10-26 15:39:28 +08:00
static void genJsonConfig(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc)
{
yyjson_mut_val* modules = yyjson_mut_obj_get(doc->root, "modules");
if (!modules)
modules = yyjson_mut_obj_add_arr(doc, doc->root, "modules");
yyjson_mut_val* module = yyjson_mut_obj(doc);
FF_STRBUF_AUTO_DESTROY type = ffStrbufCreateS(baseInfo->name);
ffStrbufLowerCase(&type);
yyjson_mut_obj_add_strbuf(doc, module, "type", &type);
if (baseInfo->generateJsonConfig)
baseInfo->generateJsonConfig(baseInfo, doc, module);
if (yyjson_mut_obj_size(module) > 1)
yyjson_mut_arr_add_val(modules, module);
else
yyjson_mut_arr_add_strbuf(doc, modules, &type);
}
static void genJsonResult(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc)
{
yyjson_mut_val* module = yyjson_mut_arr_add_obj(doc, doc->root);
yyjson_mut_obj_add_str(doc, module, "type", baseInfo->name);
if (baseInfo->generateJsonResult)
baseInfo->generateJsonResult(baseInfo, doc, module);
else
yyjson_mut_obj_add_str(doc, module, "error", "Unsupported for JSON format");
}
static void parseStructureCommand(
const char* line,
FFlist* customValues,
void (*fn)(FFModuleBaseInfo *baseInfo, yyjson_mut_doc* jsonDoc),
yyjson_mut_doc* jsonDoc
)
2023-08-29 11:13:55 +08:00
{
// handle `--set` and `--set-keyless`
FF_LIST_FOR_EACH(FFCustomValue, customValue, *customValues)
{
if (ffStrbufEqualS(&customValue->key, line))
{
__attribute__((__cleanup__(ffDestroyCustomOptions))) FFCustomOptions options;
ffInitCustomOptions(&options);
if (customValue->printKey)
ffStrbufAppend(&options.moduleArgs.key, &customValue->key);
ffStrbufAppend(&options.moduleArgs.outputFormat, &customValue->value);
2023-10-26 15:39:28 +08:00
if (__builtin_expect(jsonDoc != NULL, false))
fn((FFModuleBaseInfo*) &options, jsonDoc);
else
ffPrintCustom(&options);
2023-08-29 11:13:55 +08:00
return;
}
}
2023-10-26 15:39:28 +08:00
if(isalpha(line[0]))
{
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(line[0]) - 'A']; *modules; ++modules)
{
FFModuleBaseInfo* baseInfo = *modules;
if (ffStrEqualsIgnCase(line, baseInfo->name))
{
if (__builtin_expect(jsonDoc != NULL, false))
fn(baseInfo, jsonDoc);
else
baseInfo->printModule(baseInfo);
return;
}
}
}
ffPrintErrorString(line, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "<no implementation provided>");
2023-08-29 11:13:55 +08:00
}
2023-10-26 15:39:28 +08:00
void ffPrintCommandOption(FFdata* data, yyjson_mut_doc* jsonDoc)
2023-08-29 11:13:55 +08:00
{
//Parse the structure and call the modules
uint32_t startIndex = 0;
while (startIndex < data->structure.length)
{
uint32_t colonIndex = ffStrbufNextIndexC(&data->structure, startIndex, ':');
data->structure.chars[colonIndex] = '\0';
uint64_t ms = 0;
2023-10-26 10:26:15 +08:00
if(instance.config.display.stat)
2023-08-29 11:13:55 +08:00
ms = ffTimeGetTick();
2023-10-26 15:39:28 +08:00
parseStructureCommand(data->structure.chars + startIndex, &data->customValues, genJsonResult, jsonDoc);
2023-08-29 11:13:55 +08:00
2023-10-26 10:26:15 +08:00
if(instance.config.display.stat)
2023-08-29 11:13:55 +08:00
{
ms = ffTimeGetTick() - ms;
2023-10-26 15:39:28 +08:00
if (jsonDoc)
{
2023-10-26 15:39:28 +08:00
yyjson_mut_val* moduleJson = yyjson_mut_arr_get_last(jsonDoc->root);
yyjson_mut_obj_add_uint(jsonDoc, moduleJson, "stat", ms);
}
2023-08-29 11:13:55 +08:00
else
{
char str[32];
int len = snprintf(str, sizeof str, "%" PRIu64 "ms", ms);
2023-10-26 10:26:15 +08:00
if(instance.config.display.pipe)
puts(str);
else
printf("\033[s\033[1A\033[9999999C\033[%dD%s\033[u", len, str); // Save; Up 1; Right 9999999; Left <len>; Print <str>; Load
}
2023-08-29 11:13:55 +08:00
}
#if defined(_WIN32)
2023-10-26 15:39:28 +08:00
if (!jsonDoc && !instance.config.display.noBuffer) fflush(stdout);
2023-08-29 11:13:55 +08:00
#endif
startIndex = colonIndex + 1;
}
}
2023-10-26 15:39:28 +08:00
void ffMigrateCommandOptionToJsonc(FFdata* data, yyjson_mut_doc* jsonDoc)
{
//If we don't have a custom structure, use the default one
if(data->structure.length == 0)
ffStrbufAppendS(&data->structure, FASTFETCH_DATATEXT_STRUCTURE);
2023-10-26 15:39:28 +08:00
//Parse the structure and call the modules
uint32_t startIndex = 0;
while (startIndex < data->structure.length)
{
uint32_t colonIndex = ffStrbufNextIndexC(&data->structure, startIndex, ':');
data->structure.chars[colonIndex] = '\0';
parseStructureCommand(data->structure.chars + startIndex, &data->customValues, genJsonConfig, jsonDoc);
startIndex = colonIndex + 1;
}
}