Skip to content

Commit 3d4a117

Browse files
committed
Swap: support separated output
1 parent 7ec0c66 commit 3d4a117

File tree

2 files changed

+94
-18
lines changed

2 files changed

+94
-18
lines changed

src/modules/swap/option.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ typedef struct FFSwapOptions
1111
FFModuleArgs moduleArgs;
1212

1313
FFPercentageModuleConfig percent;
14+
bool separate;
1415
} FFSwapOptions;

src/modules/swap/swap.c

Lines changed: 93 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,44 @@
66
#include "modules/swap/swap.h"
77
#include "util/stringUtils.h"
88

9-
void ffPrintSwap(FFSwapOptions* options)
9+
void printSwap(FFSwapOptions* options, uint8_t index, FFSwapResult* storage)
1010
{
11-
FFSwapResult storage = {};
12-
const char* error = ffDetectSwap(&storage);
11+
FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate();
1312

14-
if(error)
13+
if (options->moduleArgs.key.length == 0)
1514
{
16-
ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error);
17-
return;
15+
if (storage->name.length > 0)
16+
ffStrbufSetF(&key, "%s (%s)", FF_SWAP_MODULE_NAME, storage->name.chars);
17+
else
18+
ffStrbufSetS(&key, FF_SWAP_MODULE_NAME);
19+
}
20+
else
21+
{
22+
ffStrbufClear(&key);
23+
FF_PARSE_FORMAT_STRING_CHECKED(&key, &options->moduleArgs.key, ((FFformatarg[]) {
24+
FF_FORMAT_ARG(index, "index"),
25+
FF_FORMAT_ARG(storage->name, "name"),
26+
FF_FORMAT_ARG(options->moduleArgs.keyIcon, "icon"),
27+
}));
1828
}
1929

2030
FF_STRBUF_AUTO_DESTROY usedPretty = ffStrbufCreate();
21-
ffParseSize(storage.bytesUsed, &usedPretty);
31+
ffParseSize(storage->bytesUsed, &usedPretty);
2232

2333
FF_STRBUF_AUTO_DESTROY totalPretty = ffStrbufCreate();
24-
ffParseSize(storage.bytesTotal, &totalPretty);
34+
ffParseSize(storage->bytesTotal, &totalPretty);
2535

26-
double percentage = storage.bytesTotal == 0
36+
double percentage = storage->bytesTotal == 0
2737
? 0
28-
: (double) storage.bytesUsed / (double) storage.bytesTotal * 100.0;
38+
: (double) storage->bytesUsed / (double) storage->bytesTotal * 100.0;
2939

3040
FFPercentageTypeFlags percentType = options->percent.type == 0 ? instance.config.display.percentType : options->percent.type;
3141
if(options->moduleArgs.outputFormat.length == 0)
3242
{
33-
ffPrintLogoAndKey(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
43+
ffPrintLogoAndKey(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY);
3444
FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate();
3545

36-
if (storage.bytesTotal == 0)
46+
if (storage->bytesTotal == 0)
3747
{
3848
if(percentType & FF_PERCENTAGE_TYPE_BAR_BIT)
3949
{
@@ -71,15 +81,56 @@ void ffPrintSwap(FFSwapOptions* options)
7181
FF_STRBUF_AUTO_DESTROY percentageBar = ffStrbufCreate();
7282
if (percentType & FF_PERCENTAGE_TYPE_BAR_BIT)
7383
ffPercentAppendBar(&percentageBar, percentage, options->percent, &options->moduleArgs);
74-
FF_PRINT_FORMAT_CHECKED(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]){
84+
FF_PRINT_FORMAT_CHECKED(key.chars, index, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, ((FFformatarg[]){
7585
FF_FORMAT_ARG(usedPretty, "used"),
7686
FF_FORMAT_ARG(totalPretty, "total"),
7787
FF_FORMAT_ARG(percentageNum, "percentage"),
7888
FF_FORMAT_ARG(percentageBar, "percentage-bar"),
89+
FF_FORMAT_ARG(storage->name, "name"),
7990
}));
8091
}
8192
}
8293

94+
void ffPrintSwap(FFSwapOptions* options)
95+
{
96+
FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFSwapResult));
97+
const char* error = ffDetectSwap(&result);
98+
99+
if(error)
100+
{
101+
ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error);
102+
return;
103+
}
104+
105+
if (options->separate)
106+
{
107+
uint8_t index = 0;
108+
FF_LIST_FOR_EACH(FFSwapResult, storage, result)
109+
{
110+
++index;
111+
printSwap(options, index, storage);
112+
}
113+
}
114+
else
115+
{
116+
FFSwapResult total = {
117+
.name = ffStrbufCreate(),
118+
};
119+
FF_LIST_FOR_EACH(FFSwapResult, storage, result)
120+
{
121+
total.bytesUsed += storage->bytesUsed;
122+
total.bytesTotal += storage->bytesTotal;
123+
}
124+
printSwap(options, 0, &total);
125+
ffStrbufDestroy(&total.name);
126+
}
127+
128+
FF_LIST_FOR_EACH(FFSwapResult, storage, result)
129+
{
130+
ffStrbufDestroy(&storage->name);
131+
}
132+
}
133+
83134
bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const char* value)
84135
{
85136
const char* subKey = ffOptionTestPrefix(key, FF_SWAP_MODULE_NAME);
@@ -90,6 +141,12 @@ bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const ch
90141
if (ffPercentParseCommandOptions(key, subKey, value, &options->percent))
91142
return true;
92143

144+
if (ffStrEqualsIgnCase(subKey, "separate"))
145+
{
146+
options->separate = ffOptionParseBoolean(value);
147+
return true;
148+
}
149+
93150
return false;
94151
}
95152

@@ -109,6 +166,12 @@ void ffParseSwapJsonObject(FFSwapOptions* options, yyjson_val* module)
109166
if (ffPercentParseJsonObject(key, val, &options->percent))
110167
continue;
111168

169+
if (ffStrEqualsIgnCase(key, "separate"))
170+
{
171+
options->separate = yyjson_get_bool(val);
172+
continue;
173+
}
174+
112175
ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key);
113176
}
114177
}
@@ -125,18 +188,28 @@ void ffGenerateSwapJsonConfig(FFSwapOptions* options, yyjson_mut_doc* doc, yyjso
125188

126189
void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
127190
{
128-
FFSwapResult storage = {};
129-
const char* error = ffDetectSwap(&storage);
191+
FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFSwapResult));
192+
const char* error = ffDetectSwap(&result);
130193

131194
if(error)
132195
{
133196
yyjson_mut_obj_add_str(doc, module, "error", error);
134197
return;
135198
}
136199

137-
yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
138-
yyjson_mut_obj_add_uint(doc, obj, "total", storage.bytesTotal);
139-
yyjson_mut_obj_add_uint(doc, obj, "used", storage.bytesUsed);
200+
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
201+
FF_LIST_FOR_EACH(FFSwapResult, storage, result)
202+
{
203+
yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr);
204+
yyjson_mut_obj_add_strbuf(doc, obj, "name", &storage->name);
205+
yyjson_mut_obj_add_uint(doc, obj, "used", storage->bytesUsed);
206+
yyjson_mut_obj_add_uint(doc, obj, "total", storage->bytesTotal);
207+
}
208+
209+
FF_LIST_FOR_EACH(FFSwapResult, storage, result)
210+
{
211+
ffStrbufDestroy(&storage->name);
212+
}
140213
}
141214

142215
static FFModuleBaseInfo ffModuleInfo = {
@@ -152,6 +225,7 @@ static FFModuleBaseInfo ffModuleInfo = {
152225
{"Total size", "total"},
153226
{"Percentage used (num)", "percentage"},
154227
{"Percentage used (bar)", "percentage-bar"},
228+
{"Name", "name"},
155229
}))
156230
};
157231

@@ -160,6 +234,7 @@ void ffInitSwapOptions(FFSwapOptions* options)
160234
options->moduleInfo = ffModuleInfo;
161235
ffOptionInitModuleArg(&options->moduleArgs, "󰓡");
162236
options->percent = (FFPercentageModuleConfig) { 50, 80, 0 };
237+
options->separate = false;
163238
}
164239

165240
void ffDestroySwapOptions(FFSwapOptions* options)

0 commit comments

Comments
 (0)