asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
93 of 114, 0 excluded
81.6%
Functions:
44 of 57, 0 excluded
77.2%
Branches:
73 of 258, 0 excluded
28.3%

argparse.h
Line Branch Exec Source
1 // diy argument parser because NIH syndrome or something
2 #include <type_traits>
3 #include "autoarray.h"
4 #include "libstr.h"
5 #include "errors.h"
6
7 // T is a lambda with 0 or 1 arguments
8 template<typename T>
9 struct opt {
10 42 constexpr opt(char shortname, const char* longname, T&& cb)
11 42 : shortname(shortname), longname(longname), callback(cb) {}
12 char shortname;
13 const char* longname;
14 T& callback;
15 };
16
17 extern int pass;
18
19 template<typename... T>
20 3 autoarray<const char*> parse_opts(int argc, const char* argv[], opt<T>... opts) {
21 3 autoarray<const char*> positional;
22 3 int i;
23
2/4
✗ Branch 77 → 4 not taken.
✗ Branch 77 → 78 not taken.
✓ Branch 222 → 5 taken 7 times.
✓ Branch 222 → 223 taken 3 times.
13 for(i = 1; i < argc; i++) {
24
10/27
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 84 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✓ Branch 8 → 9 taken 3 times.
✓ Branch 8 → 16 taken 4 times.
✓ Branch 10 → 11 taken 3 times.
✗ Branch 10 → 12 not taken.
✗ Branch 10 → 231 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 15 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 3 times.
✓ Branch 18 → 19 taken 3 times.
✓ Branch 18 → 20 taken 4 times.
✓ Branch 20 → 21 taken 3 times.
✓ Branch 20 → 22 taken 4 times.
✓ Branch 22 → 23 taken 4 times.
✓ Branch 22 → 27 taken 3 times.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 86 not taken.
✗ Branch 231 → 232 not taken.
✗ Branch 231 → 233 not taken.
✗ Branch 234 → 235 not taken.
✗ Branch 234 → 236 not taken.
7 if(argv[i][0] != '-' || argv[i] == STR "-") {
25
1/4
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 131 not taken.
✓ Branch 25 → 26 taken 4 times.
✗ Branch 25 → 315 not taken.
4 positional.append(argv[i]);
26 4 continue;
27 }
28
2/8
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 88 not taken.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 237 not taken.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 3 times.
3 if(argv[i] == STR "--") {
29 i++;
30 break; // treat rest of the args as positional
31 }
32
33 3 bool found = false;
34 3 string helpname;
35 3 const char* inline_arg = nullptr;
36 9 auto call = [&](auto cb) {
37 3 found = true;
38 if constexpr (std::is_invocable_v<decltype(cb)>) {
39 if(inline_arg) throw_err_null(pass, err_cli_no_arg, helpname.data());
40 else cb();
41 } else {
42
2/4
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 4 not taken.
✓ Branch 7 → 8 taken 2 times.
✓ Branch 7 → 12 taken 1 time.
3 const char* arg = inline_arg ? inline_arg : argv[++i];
43
2/8
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 9 not taken.
✓ Branch 23 → 24 taken 3 times.
✗ Branch 23 → 26 not taken.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 33 taken 3 times.
3 if(!arg || !*arg) throw_err_null(pass, err_cli_missing_arg, helpname.data());
44
0/8
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 16 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 14 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 41 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 39 not taken.
3 else cb(arg);
45 }
46 };
47
48
2/4
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 49 not taken.
✓ Branch 46 → 47 taken 1 time.
✓ Branch 46 → 128 taken 2 times.
3 if(argv[i][1] == '-') {
49 // long option
50 1 const char* option = argv[i]+2;
51
1/2
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 1 time.
1 inline_arg = strchr(option, '=');
52 1 string optname{};
53
1/4
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 26 not taken.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 58 taken 1 time.
1 if(inline_arg) {
54 optname.assign(option, inline_arg - option);
55 inline_arg++;
56 }
57
1/4
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 107 not taken.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 273 not taken.
1 else optname.assign(option);
58
59
2/8
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 91 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 89 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 241 not taken.
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 239 not taken.
1 helpname = STR "--" + optname;
60 // i love this language
61 29 ([&] {
62
7/13
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 6 not taken.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
✓ Branch 6 → 7 taken 13 times.
✓ Branch 6 → 16 taken 1 time.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 14 → 16 taken 12 times.
✓ Branch 17 → 18 taken 1 time.
✓ Branch 17 → 22 taken 6 times.
✓ Branch 17 → 28 taken 7 times.
14 if(opts.longname && optname == opts.longname) call(opts.callback);
63
14/56
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 106 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 105 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 104 not taken.
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 103 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 102 not taken.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 101 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 100 not taken.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 99 not taken.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 98 not taken.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 97 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 96 not taken.
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 95 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 94 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 93 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 271 not taken.
✓ Branch 75 → 76 taken 1 time.
✗ Branch 75 → 269 not taken.
✓ Branch 78 → 79 taken 1 time.
✗ Branch 78 → 267 not taken.
✓ Branch 81 → 82 taken 1 time.
✗ Branch 81 → 265 not taken.
✓ Branch 84 → 85 taken 1 time.
✗ Branch 84 → 263 not taken.
✓ Branch 87 → 88 taken 1 time.
✗ Branch 87 → 261 not taken.
✓ Branch 90 → 91 taken 1 time.
✗ Branch 90 → 259 not taken.
✓ Branch 93 → 94 taken 1 time.
✗ Branch 93 → 257 not taken.
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 255 not taken.
✓ Branch 99 → 100 taken 1 time.
✗ Branch 99 → 253 not taken.
✓ Branch 102 → 103 taken 1 time.
✗ Branch 102 → 251 not taken.
✓ Branch 105 → 106 taken 1 time.
✗ Branch 105 → 249 not taken.
✓ Branch 108 → 109 taken 1 time.
✗ Branch 108 → 247 not taken.
✓ Branch 111 → 112 taken 1 time.
✗ Branch 111 → 245 not taken.
1 }(), ...);
64 1 } else {
65 // short option
66 2 char optname = argv[i][1];
67
1/4
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 51 not taken.
✓ Branch 137 → 138 taken 2 times.
✗ Branch 137 → 142 not taken.
2 if(argv[i][2] != 0) inline_arg = argv[i]+2;
68
2/8
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 112 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 110 not taken.
✓ Branch 144 → 145 taken 2 times.
✗ Branch 144 → 279 not taken.
✓ Branch 145 → 146 taken 2 times.
✗ Branch 145 → 277 not taken.
2 helpname = STR "-" + optname;
69 58 ([&] {
70
6/10
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 5 not taken.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
✓ Branch 5 → 6 taken 12 times.
✓ Branch 5 → 16 taken 8 times.
✓ Branch 5 → 22 taken 8 times.
✓ Branch 11 → 12 taken 2 times.
✓ Branch 11 → 16 taken 4 times.
✓ Branch 11 → 22 taken 6 times.
28 if(opts.shortname && optname == opts.shortname) call(opts.callback);
71
14/56
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 127 not taken.
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 126 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 125 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 124 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 123 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 122 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 121 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 120 not taken.
✗ Branch 64 → 65 not taken.
✗ Branch 64 → 119 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 118 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 117 not taken.
✗ Branch 67 → 68 not taken.
✗ Branch 67 → 116 not taken.
✗ Branch 68 → 69 not taken.
✗ Branch 68 → 115 not taken.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 114 not taken.
✓ Branch 154 → 155 taken 2 times.
✗ Branch 154 → 309 not taken.
✓ Branch 157 → 158 taken 2 times.
✗ Branch 157 → 307 not taken.
✓ Branch 160 → 161 taken 2 times.
✗ Branch 160 → 305 not taken.
✓ Branch 163 → 164 taken 2 times.
✗ Branch 163 → 303 not taken.
✓ Branch 166 → 167 taken 2 times.
✗ Branch 166 → 301 not taken.
✓ Branch 169 → 170 taken 2 times.
✗ Branch 169 → 299 not taken.
✓ Branch 172 → 173 taken 2 times.
✗ Branch 172 → 297 not taken.
✓ Branch 175 → 176 taken 2 times.
✗ Branch 175 → 295 not taken.
✓ Branch 178 → 179 taken 2 times.
✗ Branch 178 → 293 not taken.
✓ Branch 181 → 182 taken 2 times.
✗ Branch 181 → 291 not taken.
✓ Branch 184 → 185 taken 2 times.
✗ Branch 184 → 289 not taken.
✓ Branch 187 → 188 taken 2 times.
✗ Branch 187 → 287 not taken.
✓ Branch 190 → 191 taken 2 times.
✗ Branch 190 → 285 not taken.
✓ Branch 193 → 194 taken 2 times.
✗ Branch 193 → 283 not taken.
2 }(), ...);
72 }
73
2/6
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 74 not taken.
✗ Branch 209 → 210 not taken.
✓ Branch 209 → 211 taken 3 times.
✗ Branch 211 → 212 not taken.
✓ Branch 211 → 214 taken 3 times.
3 if(!found) {
74 throw_err_null(pass, err_cli_unknown_opt, helpname.data());
75 }
76 }
77 // rest are positional
78
1/8
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 132 not taken.
✗ Branch 81 → 79 not taken.
✗ Branch 81 → 82 not taken.
✗ Branch 226 → 227 not taken.
✗ Branch 226 → 320 not taken.
✗ Branch 228 → 224 not taken.
✓ Branch 228 → 229 taken 3 times.
3 for(; i < argc; i++) positional.append(argv[i]);
79 3 return positional;
80 }
81