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((char8_t*) argv[0], &argv0)) {
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((char8_t*) argv[i], &arg)) {
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}