@shd101wyy/yo 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/skills/yo-async-effects/SKILL.md +4 -4
- package/.github/skills/yo-async-effects/async-effects-recipes.md +34 -34
- package/.github/skills/yo-core-patterns/SKILL.md +1 -1
- package/.github/skills/yo-core-patterns/core-patterns-cheatsheet.md +26 -26
- package/.github/skills/yo-project-workflow/SKILL.md +6 -3
- package/.github/skills/yo-project-workflow/workflow-cheatsheet.md +34 -11
- package/.github/skills/yo-syntax/SKILL.md +7 -6
- package/.github/skills/yo-syntax/syntax-cheatsheet.md +73 -60
- package/.github/skills/yo-wasm-integration/wasm-integration-cheatsheet.md +3 -3
- package/README.md +10 -8
- package/out/cjs/index.cjs +456 -438
- package/out/cjs/yo-cli.cjs +576 -543
- package/out/cjs/yo-lsp.cjs +559 -532
- package/out/esm/index.mjs +281 -263
- package/out/types/src/formatter.d.ts +11 -0
- package/out/types/src/lsp/formatting.d.ts +2 -0
- package/out/types/src/tests/formatter.test.d.ts +1 -0
- package/out/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/std/alg/hash.yo +13 -21
- package/std/allocator.yo +25 -40
- package/std/async.yo +3 -7
- package/std/build.yo +105 -151
- package/std/cli/arg_parser.yo +184 -169
- package/std/collections/array_list.yo +350 -314
- package/std/collections/btree_map.yo +142 -131
- package/std/collections/deque.yo +132 -128
- package/std/collections/hash_map.yo +542 -566
- package/std/collections/hash_set.yo +623 -687
- package/std/collections/linked_list.yo +275 -293
- package/std/collections/ordered_map.yo +113 -85
- package/std/collections/priority_queue.yo +73 -73
- package/std/crypto/md5.yo +191 -95
- package/std/crypto/random.yo +56 -64
- package/std/crypto/sha256.yo +151 -107
- package/std/encoding/base64.yo +87 -81
- package/std/encoding/hex.yo +43 -50
- package/std/encoding/html.yo +56 -81
- package/std/encoding/html_char_utils.yo +7 -13
- package/std/encoding/html_entities.yo +2248 -2253
- package/std/encoding/json.yo +316 -224
- package/std/encoding/punycode.yo +86 -116
- package/std/encoding/toml.yo +67 -66
- package/std/encoding/utf16.yo +37 -44
- package/std/env.yo +62 -91
- package/std/error.yo +7 -15
- package/std/fmt/display.yo +5 -9
- package/std/fmt/index.yo +8 -14
- package/std/fmt/to_string.yo +330 -315
- package/std/fmt/writer.yo +58 -87
- package/std/fs/dir.yo +83 -102
- package/std/fs/file.yo +147 -180
- package/std/fs/metadata.yo +45 -78
- package/std/fs/temp.yo +55 -65
- package/std/fs/types.yo +27 -40
- package/std/fs/walker.yo +53 -68
- package/std/gc.yo +5 -8
- package/std/glob.yo +30 -43
- package/std/http/client.yo +107 -120
- package/std/http/http.yo +106 -96
- package/std/http/index.yo +4 -6
- package/std/imm/list.yo +88 -93
- package/std/imm/map.yo +528 -464
- package/std/imm/set.yo +52 -57
- package/std/imm/sorted_map.yo +340 -286
- package/std/imm/sorted_set.yo +57 -63
- package/std/imm/string.yo +404 -345
- package/std/imm/vec.yo +173 -181
- package/std/io/reader.yo +3 -6
- package/std/io/writer.yo +4 -8
- package/std/libc/assert.yo +5 -9
- package/std/libc/ctype.yo +32 -22
- package/std/libc/dirent.yo +26 -25
- package/std/libc/errno.yo +164 -90
- package/std/libc/fcntl.yo +52 -45
- package/std/libc/float.yo +66 -44
- package/std/libc/limits.yo +42 -33
- package/std/libc/math.yo +53 -82
- package/std/libc/signal.yo +72 -47
- package/std/libc/stdatomic.yo +217 -188
- package/std/libc/stdint.yo +5 -29
- package/std/libc/stdio.yo +5 -29
- package/std/libc/stdlib.yo +32 -39
- package/std/libc/string.yo +5 -23
- package/std/libc/sys/stat.yo +58 -56
- package/std/libc/time.yo +5 -19
- package/std/libc/unistd.yo +5 -20
- package/std/libc/wctype.yo +6 -9
- package/std/libc/windows.yo +26 -30
- package/std/log.yo +41 -55
- package/std/net/addr.yo +102 -97
- package/std/net/dns.yo +27 -28
- package/std/net/errors.yo +50 -49
- package/std/net/tcp.yo +113 -124
- package/std/net/udp.yo +55 -66
- package/std/os/env.yo +35 -33
- package/std/os/signal.yo +15 -25
- package/std/path.yo +276 -311
- package/std/prelude.yo +6304 -4315
- package/std/process/command.yo +87 -103
- package/std/process/index.yo +12 -31
- package/std/regex/compiler.yo +196 -95
- package/std/regex/flags.yo +58 -39
- package/std/regex/index.yo +157 -173
- package/std/regex/match.yo +20 -31
- package/std/regex/node.yo +134 -152
- package/std/regex/parser.yo +283 -259
- package/std/regex/unicode.yo +172 -202
- package/std/regex/vm.yo +155 -171
- package/std/string/index.yo +5 -7
- package/std/string/rune.yo +45 -55
- package/std/string/string.yo +937 -964
- package/std/string/string_builder.yo +94 -104
- package/std/string/unicode.yo +46 -64
- package/std/sync/channel.yo +72 -73
- package/std/sync/cond.yo +31 -36
- package/std/sync/mutex.yo +30 -32
- package/std/sync/once.yo +13 -16
- package/std/sync/rwlock.yo +26 -31
- package/std/sync/waitgroup.yo +20 -25
- package/std/sys/advise.yo +16 -24
- package/std/sys/bufio/buf_reader.yo +77 -93
- package/std/sys/bufio/buf_writer.yo +52 -65
- package/std/sys/clock.yo +4 -9
- package/std/sys/constants.yo +77 -61
- package/std/sys/copy.yo +4 -10
- package/std/sys/dir.yo +26 -43
- package/std/sys/dns.yo +41 -61
- package/std/sys/errors.yo +95 -103
- package/std/sys/events.yo +45 -57
- package/std/sys/externs.yo +319 -267
- package/std/sys/fallocate.yo +7 -11
- package/std/sys/fcntl.yo +14 -22
- package/std/sys/file.yo +26 -40
- package/std/sys/future.yo +5 -8
- package/std/sys/iov.yo +12 -25
- package/std/sys/lock.yo +12 -13
- package/std/sys/mmap.yo +38 -43
- package/std/sys/path.yo +3 -8
- package/std/sys/perm.yo +7 -21
- package/std/sys/pipe.yo +5 -12
- package/std/sys/process.yo +23 -29
- package/std/sys/seek.yo +10 -12
- package/std/sys/signal.yo +7 -13
- package/std/sys/signals.yo +52 -35
- package/std/sys/socket.yo +63 -58
- package/std/sys/socketpair.yo +3 -6
- package/std/sys/sockinfo.yo +11 -20
- package/std/sys/statfs.yo +11 -34
- package/std/sys/statx.yo +25 -52
- package/std/sys/sysinfo.yo +15 -20
- package/std/sys/tcp.yo +62 -92
- package/std/sys/temp.yo +5 -9
- package/std/sys/time.yo +5 -15
- package/std/sys/timer.yo +6 -11
- package/std/sys/tty.yo +10 -18
- package/std/sys/udp.yo +22 -39
- package/std/sys/umask.yo +3 -6
- package/std/sys/unix.yo +33 -52
- package/std/testing/bench.yo +49 -52
- package/std/thread.yo +10 -15
- package/std/time/datetime.yo +105 -89
- package/std/time/duration.yo +43 -56
- package/std/time/instant.yo +13 -18
- package/std/time/sleep.yo +5 -9
- package/std/url/index.yo +184 -209
- package/std/worker.yo +6 -10
package/std/cli/arg_parser.yo
CHANGED
|
@@ -13,10 +13,8 @@
|
|
|
13
13
|
//! parser.option(`output`, `o`, `Output file`, `out.txt`);
|
|
14
14
|
//! args := parser.parse();
|
|
15
15
|
//! ```
|
|
16
|
-
|
|
17
|
-
open
|
|
18
|
-
open import "../string";
|
|
19
|
-
|
|
16
|
+
open(import("../collections/array_list"));
|
|
17
|
+
open(import("../string"));
|
|
20
18
|
/// Kind of command-line argument.
|
|
21
19
|
ArgKind :: enum(
|
|
22
20
|
/// Boolean flag (e.g. `--verbose`).
|
|
@@ -26,7 +24,6 @@ ArgKind :: enum(
|
|
|
26
24
|
/// Positional argument.
|
|
27
25
|
Positional
|
|
28
26
|
);
|
|
29
|
-
|
|
30
27
|
/// Definition of a single command-line argument.
|
|
31
28
|
ArgDef :: object(
|
|
32
29
|
/// Long name (e.g. `"verbose"` for `--verbose`).
|
|
@@ -42,7 +39,6 @@ ArgDef :: object(
|
|
|
42
39
|
/// Whether this argument is required.
|
|
43
40
|
_required : bool
|
|
44
41
|
);
|
|
45
|
-
|
|
46
42
|
/// Result of parsing command-line arguments.
|
|
47
43
|
ParsedArgs :: object(
|
|
48
44
|
_set_flags : ArrayList(String),
|
|
@@ -55,7 +51,6 @@ ParsedArgs :: object(
|
|
|
55
51
|
/// Parsed arguments for the chosen subcommand (`.None` if no subcommand).
|
|
56
52
|
_subcommand_args : Option(Self)
|
|
57
53
|
);
|
|
58
|
-
|
|
59
54
|
/// Command-line argument parser.
|
|
60
55
|
ArgParser :: object(
|
|
61
56
|
/// Application name shown in help text.
|
|
@@ -71,36 +66,33 @@ ArgParser :: object(
|
|
|
71
66
|
/// Subcommand parsers (parallel to `_subcommand_names`).
|
|
72
67
|
_subcommand_parsers : ArrayList(Self)
|
|
73
68
|
);
|
|
74
|
-
|
|
75
|
-
|
|
69
|
+
impl(
|
|
70
|
+
ParsedArgs,
|
|
76
71
|
new : (fn() -> Self)(
|
|
77
72
|
Self(
|
|
78
|
-
_set_flags: ArrayList(String).new(),
|
|
79
|
-
_option_names: ArrayList(String).new(),
|
|
80
|
-
_option_values: ArrayList(String).new(),
|
|
81
|
-
_positionals: ArrayList(String).new(),
|
|
82
|
-
_positional_names: ArrayList(String).new(),
|
|
83
|
-
_subcommand
|
|
84
|
-
_subcommand_args
|
|
73
|
+
_set_flags : ArrayList(String).new(),
|
|
74
|
+
_option_names : ArrayList(String).new(),
|
|
75
|
+
_option_values : ArrayList(String).new(),
|
|
76
|
+
_positionals : ArrayList(String).new(),
|
|
77
|
+
_positional_names : ArrayList(String).new(),
|
|
78
|
+
_subcommand :.None,
|
|
79
|
+
_subcommand_args :.None
|
|
85
80
|
)
|
|
86
81
|
),
|
|
87
|
-
|
|
88
82
|
/// Returns the name of the chosen subcommand, if any.
|
|
89
|
-
get_subcommand : (fn(self: Self) -> Option(String))(self._subcommand),
|
|
90
|
-
|
|
83
|
+
get_subcommand : (fn(self : Self) -> Option(String))(self._subcommand),
|
|
91
84
|
/// Returns the parsed arguments of the chosen subcommand, if any.
|
|
92
|
-
get_subcommand_args : (fn(self: Self) -> Option(Self))(self._subcommand_args),
|
|
93
|
-
|
|
94
|
-
get_flag : (fn(self: Self, name: String) -> bool)(
|
|
85
|
+
get_subcommand_args : (fn(self : Self) -> Option(Self))(self._subcommand_args),
|
|
86
|
+
get_flag : (fn(self : Self, name : String) -> bool)(
|
|
95
87
|
self._set_flags.contains(name)
|
|
96
88
|
),
|
|
97
|
-
|
|
98
|
-
_lookup : (fn(self: Self, names: ArrayList(String), values: ArrayList(String), name: String) -> Option(String))({
|
|
89
|
+
_lookup : (fn(self : Self, names : ArrayList(String), values : ArrayList(String), name : String) -> Option(String))({
|
|
99
90
|
i := usize(0);
|
|
100
91
|
len := names.len();
|
|
101
|
-
(result : Option(String))
|
|
102
|
-
while
|
|
103
|
-
match(
|
|
92
|
+
(result : Option(String)) =.None;
|
|
93
|
+
while(i < len, i = (i + usize(1)), {
|
|
94
|
+
match(
|
|
95
|
+
names.get(i),
|
|
104
96
|
.Some(n) => {
|
|
105
97
|
cond(
|
|
106
98
|
(n == name) => {
|
|
@@ -112,108 +104,109 @@ impl(ParsedArgs,
|
|
|
112
104
|
},
|
|
113
105
|
.None => ()
|
|
114
106
|
);
|
|
115
|
-
};
|
|
116
|
-
return
|
|
107
|
+
});
|
|
108
|
+
return(result);
|
|
117
109
|
}),
|
|
118
|
-
|
|
119
|
-
get_option : (fn(self: Self, name: String) -> Option(String))(
|
|
110
|
+
get_option : (fn(self : Self, name : String) -> Option(String))(
|
|
120
111
|
self._lookup(self._option_names, self._option_values, name)
|
|
121
112
|
),
|
|
122
|
-
|
|
123
|
-
get_positional : (fn(self: Self, name: String) -> Option(String))(
|
|
113
|
+
get_positional : (fn(self : Self, name : String) -> Option(String))(
|
|
124
114
|
self._lookup(self._positional_names, self._positionals, name)
|
|
125
115
|
),
|
|
126
|
-
|
|
127
|
-
get_positional_at : (fn(self: Self, index: usize) -> Option(String))(
|
|
116
|
+
get_positional_at : (fn(self : Self, index : usize) -> Option(String))(
|
|
128
117
|
self._positionals.get(index)
|
|
129
118
|
)
|
|
130
119
|
);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
new : (fn(name: String, description: String) -> Self)(
|
|
120
|
+
impl(
|
|
121
|
+
ArgParser,
|
|
122
|
+
new : (fn(name : String, description : String) -> Self)(
|
|
134
123
|
Self(
|
|
135
|
-
_name: name,
|
|
136
|
-
_description: description,
|
|
137
|
-
_args: ArrayList(ArgDef).new(),
|
|
138
|
-
_subcommand_names: ArrayList(String).new(),
|
|
139
|
-
_subcommand_descriptions: ArrayList(String).new(),
|
|
140
|
-
_subcommand_parsers: ArrayList(Self).new()
|
|
124
|
+
_name : name,
|
|
125
|
+
_description : description,
|
|
126
|
+
_args : ArrayList(ArgDef).new(),
|
|
127
|
+
_subcommand_names : ArrayList(String).new(),
|
|
128
|
+
_subcommand_descriptions : ArrayList(String).new(),
|
|
129
|
+
_subcommand_parsers : ArrayList(Self).new()
|
|
141
130
|
)
|
|
142
131
|
),
|
|
143
|
-
|
|
144
132
|
/// Registers a subcommand with the given name and description.
|
|
145
133
|
/// Returns the new sub-parser, which can be configured with its own
|
|
146
134
|
/// flags, options, positionals, and nested subcommands.
|
|
147
|
-
add_subcommand : (fn(self: Self, name: String, description: String) -> Self)({
|
|
135
|
+
add_subcommand : (fn(self : Self, name : String, description : String) -> Self)({
|
|
148
136
|
sub := Self.new(name, description);
|
|
149
137
|
self._subcommand_names.push(name);
|
|
150
138
|
self._subcommand_descriptions.push(description);
|
|
151
139
|
self._subcommand_parsers.push(sub);
|
|
152
|
-
return
|
|
140
|
+
return(sub);
|
|
153
141
|
}),
|
|
154
|
-
|
|
155
142
|
/// Looks up a subcommand parser by name.
|
|
156
|
-
_find_subcommand : (fn(self: Self, name: String) -> Option(usize))({
|
|
143
|
+
_find_subcommand : (fn(self : Self, name : String) -> Option(usize))({
|
|
157
144
|
i := usize(0);
|
|
158
145
|
len := self._subcommand_names.len();
|
|
159
|
-
(result : Option(usize))
|
|
160
|
-
while
|
|
161
|
-
match(
|
|
146
|
+
(result : Option(usize)) =.None;
|
|
147
|
+
while((i < len) && result.is_none(), i = (i + usize(1)), {
|
|
148
|
+
match(
|
|
149
|
+
self._subcommand_names.get(i),
|
|
162
150
|
.Some(n) => {
|
|
163
151
|
cond(
|
|
164
|
-
(n == name) => {
|
|
152
|
+
(n == name) => {
|
|
153
|
+
result =.Some(i);
|
|
154
|
+
},
|
|
165
155
|
true => ()
|
|
166
156
|
);
|
|
167
157
|
},
|
|
168
158
|
.None => ()
|
|
169
159
|
);
|
|
170
|
-
};
|
|
171
|
-
return
|
|
160
|
+
});
|
|
161
|
+
return(result);
|
|
172
162
|
}),
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
163
|
+
add_flag : (fn(self : Self, long_name : String, short_name : String, description : String) -> unit)({
|
|
164
|
+
self._args.push(
|
|
165
|
+
ArgDef(
|
|
166
|
+
_long_name : long_name,
|
|
167
|
+
_short_name : short_name,
|
|
168
|
+
_description : description,
|
|
169
|
+
_kind :.Flag,
|
|
170
|
+
_default_value : ``,
|
|
171
|
+
_required : false
|
|
172
|
+
)
|
|
173
|
+
);
|
|
183
174
|
}),
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
175
|
+
add_option : (fn(self : Self, long_name : String, short_name : String, description : String, default_value : String) -> unit)({
|
|
176
|
+
self._args.push(
|
|
177
|
+
ArgDef(
|
|
178
|
+
_long_name : long_name,
|
|
179
|
+
_short_name : short_name,
|
|
180
|
+
_description : description,
|
|
181
|
+
_kind :.Opt,
|
|
182
|
+
_default_value : default_value,
|
|
183
|
+
_required : false
|
|
184
|
+
)
|
|
185
|
+
);
|
|
194
186
|
}),
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
187
|
+
add_positional : (fn(self : Self, name : String, description : String) -> unit)({
|
|
188
|
+
self._args.push(
|
|
189
|
+
ArgDef(
|
|
190
|
+
_long_name : name,
|
|
191
|
+
_short_name : ``,
|
|
192
|
+
_description : description,
|
|
193
|
+
_kind :.Positional,
|
|
194
|
+
_default_value : ``,
|
|
195
|
+
_required : true
|
|
196
|
+
)
|
|
197
|
+
);
|
|
205
198
|
}),
|
|
206
|
-
|
|
207
|
-
_find_arg_index : (fn(self: Self, name: String) -> Option(usize))({
|
|
199
|
+
_find_arg_index : (fn(self : Self, name : String) -> Option(usize))({
|
|
208
200
|
i := usize(0);
|
|
209
201
|
len := self._args.len();
|
|
210
|
-
(result : Option(usize))
|
|
211
|
-
while
|
|
212
|
-
match(
|
|
202
|
+
(result : Option(usize)) =.None;
|
|
203
|
+
while(i < len, i = (i + usize(1)), {
|
|
204
|
+
match(
|
|
205
|
+
self._args.get(i),
|
|
213
206
|
.Some(arg_def) => {
|
|
214
207
|
cond(
|
|
215
208
|
((arg_def._long_name == name) || (arg_def._short_name == name)) => {
|
|
216
|
-
result
|
|
209
|
+
result =.Some(i);
|
|
217
210
|
i = len;
|
|
218
211
|
},
|
|
219
212
|
true => ()
|
|
@@ -221,38 +214,45 @@ impl(ArgParser,
|
|
|
221
214
|
},
|
|
222
215
|
.None => ()
|
|
223
216
|
);
|
|
224
|
-
};
|
|
225
|
-
return
|
|
217
|
+
});
|
|
218
|
+
return(result);
|
|
226
219
|
}),
|
|
227
|
-
|
|
228
|
-
help_text : (fn(self: Self) -> String)({
|
|
220
|
+
help_text : (fn(self : Self) -> String)({
|
|
229
221
|
text := `Usage: ${self._name}\n${self._description}\n\n`;
|
|
230
|
-
|
|
231
222
|
has_positionals := false;
|
|
232
223
|
has_flags_or_options := false;
|
|
233
224
|
i := usize(0);
|
|
234
225
|
len := self._args.len();
|
|
235
|
-
while
|
|
236
|
-
match(
|
|
226
|
+
while(i < len, i = (i + usize(1)), {
|
|
227
|
+
match(
|
|
228
|
+
self._args.get(i),
|
|
237
229
|
.Some(arg_def) => {
|
|
238
|
-
match(
|
|
239
|
-
.
|
|
240
|
-
.
|
|
241
|
-
|
|
230
|
+
match(
|
|
231
|
+
arg_def._kind,
|
|
232
|
+
.Flag => {
|
|
233
|
+
has_flags_or_options = true;
|
|
234
|
+
},
|
|
235
|
+
.Opt => {
|
|
236
|
+
has_flags_or_options = true;
|
|
237
|
+
},
|
|
238
|
+
.Positional => {
|
|
239
|
+
has_positionals = true;
|
|
240
|
+
}
|
|
242
241
|
);
|
|
243
242
|
},
|
|
244
243
|
.None => ()
|
|
245
244
|
);
|
|
246
|
-
};
|
|
247
|
-
|
|
245
|
+
});
|
|
248
246
|
cond(
|
|
249
247
|
has_positionals => {
|
|
250
248
|
text = text.concat(`Arguments:\n`);
|
|
251
249
|
j := usize(0);
|
|
252
|
-
while
|
|
253
|
-
match(
|
|
250
|
+
while(j < len, j = (j + usize(1)), {
|
|
251
|
+
match(
|
|
252
|
+
self._args.get(j),
|
|
254
253
|
.Some(arg_def) => {
|
|
255
|
-
match(
|
|
254
|
+
match(
|
|
255
|
+
arg_def._kind,
|
|
256
256
|
.Positional => {
|
|
257
257
|
text = text.concat(` ${arg_def._long_name}\t${arg_def._description}\n`);
|
|
258
258
|
},
|
|
@@ -262,20 +262,21 @@ impl(ArgParser,
|
|
|
262
262
|
},
|
|
263
263
|
.None => ()
|
|
264
264
|
);
|
|
265
|
-
};
|
|
265
|
+
});
|
|
266
266
|
text = text.concat(`\n`);
|
|
267
267
|
},
|
|
268
268
|
true => ()
|
|
269
269
|
);
|
|
270
|
-
|
|
271
270
|
cond(
|
|
272
271
|
has_flags_or_options => {
|
|
273
272
|
text = text.concat(`Options:\n`);
|
|
274
273
|
k := usize(0);
|
|
275
|
-
while
|
|
276
|
-
match(
|
|
274
|
+
while(k < len, k = (k + usize(1)), {
|
|
275
|
+
match(
|
|
276
|
+
self._args.get(k),
|
|
277
277
|
.Some(arg_def) => {
|
|
278
|
-
match(
|
|
278
|
+
match(
|
|
279
|
+
arg_def._kind,
|
|
279
280
|
.Flag => {
|
|
280
281
|
line := ` ${arg_def._long_name}`;
|
|
281
282
|
cond(
|
|
@@ -310,22 +311,22 @@ impl(ArgParser,
|
|
|
310
311
|
},
|
|
311
312
|
.None => ()
|
|
312
313
|
);
|
|
313
|
-
};
|
|
314
|
+
});
|
|
314
315
|
},
|
|
315
316
|
true => ()
|
|
316
317
|
);
|
|
317
|
-
|
|
318
318
|
text = text.concat(` --help, -h\tShow this help message\n`);
|
|
319
|
-
|
|
320
319
|
sub_count := self._subcommand_names.len();
|
|
321
320
|
cond(
|
|
322
321
|
(sub_count > usize(0)) => {
|
|
323
322
|
text = text.concat(`\nSubcommands:\n`);
|
|
324
323
|
s := usize(0);
|
|
325
|
-
while
|
|
326
|
-
match(
|
|
324
|
+
while(s < sub_count, s = (s + usize(1)), {
|
|
325
|
+
match(
|
|
326
|
+
self._subcommand_names.get(s),
|
|
327
327
|
.Some(sn) => {
|
|
328
|
-
match(
|
|
328
|
+
match(
|
|
329
|
+
self._subcommand_descriptions.get(s),
|
|
329
330
|
.Some(sd) => {
|
|
330
331
|
text = text.concat(` ${sn}\t${sd}\n`);
|
|
331
332
|
},
|
|
@@ -336,38 +337,39 @@ impl(ArgParser,
|
|
|
336
337
|
},
|
|
337
338
|
.None => ()
|
|
338
339
|
);
|
|
339
|
-
};
|
|
340
|
+
});
|
|
340
341
|
},
|
|
341
342
|
true => ()
|
|
342
343
|
);
|
|
343
|
-
|
|
344
|
-
return text;
|
|
344
|
+
return(text);
|
|
345
345
|
})
|
|
346
346
|
);
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
parse : (fn(self: Self, args: ArrayList(String)) -> Result(ParsedArgs, String))({
|
|
347
|
+
impl(
|
|
348
|
+
ArgParser,
|
|
349
|
+
parse : (fn(self : Self, args : ArrayList(String)) -> Result(ParsedArgs, String))({
|
|
350
350
|
parsed := ParsedArgs.new();
|
|
351
351
|
arg_defs_len := self._args.len();
|
|
352
|
-
|
|
353
352
|
idx := usize(1);
|
|
354
353
|
args_len := args.len();
|
|
355
354
|
positional_idx := usize(0);
|
|
356
|
-
(err_msg : Option(String))
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
355
|
+
(err_msg : Option(String)) =.None;
|
|
356
|
+
while((idx < args_len) && (err_msg.is_none()), {
|
|
357
|
+
match(
|
|
358
|
+
args.get(idx),
|
|
360
359
|
.Some(current_arg) => {
|
|
361
360
|
cond(
|
|
362
361
|
((current_arg == `--help`) || (current_arg == `-h`)) => {
|
|
363
|
-
err_msg
|
|
362
|
+
err_msg =.Some(self.help_text());
|
|
364
363
|
},
|
|
365
364
|
current_arg.starts_with(`-`) => {
|
|
366
|
-
match(
|
|
365
|
+
match(
|
|
366
|
+
self._find_arg_index(current_arg),
|
|
367
367
|
.Some(arg_idx) => {
|
|
368
|
-
match(
|
|
368
|
+
match(
|
|
369
|
+
self._args.get(arg_idx),
|
|
369
370
|
.Some(def) => {
|
|
370
|
-
match(
|
|
371
|
+
match(
|
|
372
|
+
def._kind,
|
|
371
373
|
.Flag => {
|
|
372
374
|
parsed._set_flags.push(def._long_name);
|
|
373
375
|
},
|
|
@@ -375,18 +377,19 @@ impl(ArgParser,
|
|
|
375
377
|
idx = (idx + usize(1));
|
|
376
378
|
cond(
|
|
377
379
|
(idx < args_len) => {
|
|
378
|
-
match(
|
|
380
|
+
match(
|
|
381
|
+
args.get(idx),
|
|
379
382
|
.Some(val) => {
|
|
380
383
|
parsed._option_names.push(def._long_name);
|
|
381
384
|
parsed._option_values.push(val);
|
|
382
385
|
},
|
|
383
386
|
.None => {
|
|
384
|
-
err_msg
|
|
387
|
+
err_msg =.Some(`Missing value for option: ${def._long_name}`);
|
|
385
388
|
}
|
|
386
389
|
);
|
|
387
390
|
},
|
|
388
391
|
true => {
|
|
389
|
-
err_msg
|
|
392
|
+
err_msg =.Some(`Missing value for option: ${def._long_name}`);
|
|
390
393
|
}
|
|
391
394
|
);
|
|
392
395
|
},
|
|
@@ -397,7 +400,7 @@ impl(ArgParser,
|
|
|
397
400
|
);
|
|
398
401
|
},
|
|
399
402
|
.None => {
|
|
400
|
-
err_msg
|
|
403
|
+
err_msg =.Some(`Unknown argument: ${current_arg}`);
|
|
401
404
|
}
|
|
402
405
|
);
|
|
403
406
|
},
|
|
@@ -406,33 +409,44 @@ impl(ArgParser,
|
|
|
406
409
|
is_subcmd := false;
|
|
407
410
|
cond(
|
|
408
411
|
(self._subcommand_names.len() > usize(0)) => {
|
|
409
|
-
match(
|
|
412
|
+
match(
|
|
413
|
+
self._find_subcommand(current_arg),
|
|
410
414
|
.Some(sub_idx) => {
|
|
411
|
-
match(
|
|
415
|
+
match(
|
|
416
|
+
self._subcommand_parsers.get(sub_idx),
|
|
412
417
|
.Some(sub_parser) => {
|
|
413
418
|
// Build new args list: [program_name, ...remaining args after subcommand name].
|
|
414
419
|
sub_args := ArrayList(String).new();
|
|
415
|
-
match(
|
|
416
|
-
.
|
|
417
|
-
.
|
|
420
|
+
match(
|
|
421
|
+
args.get(usize(0)),
|
|
422
|
+
.Some(prog) => {
|
|
423
|
+
sub_args.push(prog);
|
|
424
|
+
},
|
|
425
|
+
.None => {
|
|
426
|
+
sub_args.push(self._name);
|
|
427
|
+
}
|
|
418
428
|
);
|
|
419
429
|
j := (idx + usize(1));
|
|
420
|
-
while
|
|
421
|
-
match(
|
|
422
|
-
.
|
|
430
|
+
while(j < args_len, j = (j + usize(1)), {
|
|
431
|
+
match(
|
|
432
|
+
args.get(j),
|
|
433
|
+
.Some(a) => {
|
|
434
|
+
sub_args.push(a);
|
|
435
|
+
},
|
|
423
436
|
.None => ()
|
|
424
437
|
);
|
|
425
|
-
};
|
|
438
|
+
});
|
|
426
439
|
// Recursively parse the subcommand.
|
|
427
|
-
match(
|
|
440
|
+
match(
|
|
441
|
+
recur(sub_parser, sub_args),
|
|
428
442
|
.Ok(sub_parsed) => {
|
|
429
|
-
parsed._subcommand
|
|
430
|
-
parsed._subcommand_args
|
|
443
|
+
parsed._subcommand =.Some(current_arg);
|
|
444
|
+
parsed._subcommand_args =.Some(sub_parsed);
|
|
431
445
|
idx = args_len;
|
|
432
446
|
is_subcmd = true;
|
|
433
447
|
},
|
|
434
448
|
.Err(sub_err) => {
|
|
435
|
-
err_msg
|
|
449
|
+
err_msg =.Some(sub_err);
|
|
436
450
|
is_subcmd = true;
|
|
437
451
|
}
|
|
438
452
|
);
|
|
@@ -446,14 +460,16 @@ impl(ArgParser,
|
|
|
446
460
|
true => ()
|
|
447
461
|
);
|
|
448
462
|
cond(
|
|
449
|
-
(!is_subcmd) => {
|
|
463
|
+
(!(is_subcmd)) => {
|
|
450
464
|
parsed._positionals.push(current_arg);
|
|
451
465
|
p_idx := usize(0);
|
|
452
466
|
p_count := usize(0);
|
|
453
|
-
while
|
|
454
|
-
match(
|
|
467
|
+
while(p_idx < arg_defs_len, p_idx = (p_idx + usize(1)), {
|
|
468
|
+
match(
|
|
469
|
+
self._args.get(p_idx),
|
|
455
470
|
.Some(p_def) => {
|
|
456
|
-
match(
|
|
471
|
+
match(
|
|
472
|
+
p_def._kind,
|
|
457
473
|
.Positional => {
|
|
458
474
|
cond(
|
|
459
475
|
(p_count == positional_idx) => {
|
|
@@ -469,7 +485,7 @@ impl(ArgParser,
|
|
|
469
485
|
},
|
|
470
486
|
.None => ()
|
|
471
487
|
);
|
|
472
|
-
};
|
|
488
|
+
});
|
|
473
489
|
positional_idx = (positional_idx + usize(1));
|
|
474
490
|
},
|
|
475
491
|
true => ()
|
|
@@ -480,22 +496,23 @@ impl(ArgParser,
|
|
|
480
496
|
.None => ()
|
|
481
497
|
);
|
|
482
498
|
idx = (idx + usize(1));
|
|
483
|
-
};
|
|
484
|
-
|
|
499
|
+
});
|
|
485
500
|
// Check for errors
|
|
486
|
-
match(
|
|
501
|
+
match(
|
|
502
|
+
err_msg,
|
|
487
503
|
.Some(msg) => {
|
|
488
|
-
return
|
|
504
|
+
return(.Err(msg));
|
|
489
505
|
},
|
|
490
506
|
.None => ()
|
|
491
507
|
);
|
|
492
|
-
|
|
493
508
|
// Apply defaults for options not explicitly set
|
|
494
509
|
def_i := usize(0);
|
|
495
|
-
while
|
|
496
|
-
match(
|
|
510
|
+
while(def_i < arg_defs_len, def_i = (def_i + usize(1)), {
|
|
511
|
+
match(
|
|
512
|
+
self._args.get(def_i),
|
|
497
513
|
.Some(def) => {
|
|
498
|
-
match(
|
|
514
|
+
match(
|
|
515
|
+
def._kind,
|
|
499
516
|
.Opt => {
|
|
500
517
|
cond(
|
|
501
518
|
((!(parsed._option_names.contains(def._long_name))) && (!(def._default_value.is_empty()))) => {
|
|
@@ -511,15 +528,13 @@ impl(ArgParser,
|
|
|
511
528
|
},
|
|
512
529
|
.None => ()
|
|
513
530
|
);
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
return .Ok(parsed);
|
|
531
|
+
});
|
|
532
|
+
return(.Ok(parsed));
|
|
517
533
|
})
|
|
518
534
|
);
|
|
519
|
-
|
|
520
|
-
export
|
|
535
|
+
export(
|
|
521
536
|
ArgKind,
|
|
522
537
|
ArgDef,
|
|
523
538
|
ParsedArgs,
|
|
524
539
|
ArgParser
|
|
525
|
-
;
|
|
540
|
+
);
|