1#include "include/pw.h"
2
3[[nodiscard]]
4bool pw_parse_kvargs(int argc, char* argv[], PwValuePtr result)
5{
6 if (!pw_create_map(result)) {
7 return false;
8 }
9 if (argc == 0) {
10 return true;
11 }
12
13 // add argv[0] to the result
14 PwValue zero = PwUnsigned(0);
15 PwValue argv0 = PW_NULL;
16 if (!pw_create_string(&argv0, (char8_t*) argv[0])) {
17 return false;
18 }
19 if (!pw_map_update(result, &zero, &argv0)) {
20 return false;
21 }
22
23 for(int i = 1; i < argc; i++) {
24
25 // convert arg to PW string
26 PwValue arg = PW_NULL;
27 if (!_pw_create_string_utf8(&arg, (char8_t*) argv[i])) {
28 return false;
29 }
30 // split by =
31 PwValue kv = PW_NULL;
32 if (!pw_string_split_chr(&arg, '=', 1, &kv)) {
33 return false;
34 }
35 PwValue key = PW_NULL;
36 if (!pw_array_item(&kv, 0, &key)) {
37 return false;
38 }
39 if (pw_array_length(&kv) == 1) {
40 // `=` is missing, value is null
41 PwValue null = PW_NULL;
42 if (!pw_map_update(result, &key, &null)) {
43 return false;
44 }
45 } else {
46 // add key-value, overwriting previous one
47 PwValue value = PW_NULL;
48 if (!pw_array_item(&kv, 1, &value)) {
49 return false;
50 }
51 if (!pw_map_update(result, &key, &value)) {
52 return false;
53 }
54 }
55 }
56 return true;
57}