summaryrefslogtreecommitdiff
path: root/clap/streaming.zig
diff options
context:
space:
mode:
authorGravatar Jimmi Holst Christensen2024-10-22 17:46:47 +0200
committerGravatar Jimmi Holst Christensen2024-10-22 17:48:34 +0200
commite73b56aa4bcb7e53144ef96ee978f2a19b32669d (patch)
tree0ab5e3d426e25d2ad9d2e0cd0015fc010d9ea182 /clap/streaming.zig
parentfeat: Add `terminating_positional` to `clap.ParseOptions` (diff)
downloadzig-clap-e73b56aa4bcb7e53144ef96ee978f2a19b32669d.tar.gz
zig-clap-e73b56aa4bcb7e53144ef96ee978f2a19b32669d.tar.xz
zig-clap-e73b56aa4bcb7e53144ef96ee978f2a19b32669d.zip
refactor: Always access using full namespace
This is my new preferred style of programming Zig :)
Diffstat (limited to 'clap/streaming.zig')
-rw-r--r--clap/streaming.zig95
1 files changed, 43 insertions, 52 deletions
diff --git a/clap/streaming.zig b/clap/streaming.zig
index eba84bb..4a687a2 100644
--- a/clap/streaming.zig
+++ b/clap/streaming.zig
@@ -1,15 +1,3 @@
1const builtin = @import("builtin");
2const clap = @import("../clap.zig");
3const std = @import("std");
4
5const args = clap.args;
6const debug = std.debug;
7const heap = std.heap;
8const io = std.io;
9const mem = std.mem;
10const os = std.os;
11const testing = std.testing;
12
13/// The result returned from Clap.next 1/// The result returned from Clap.next
14pub fn Arg(comptime Id: type) type { 2pub fn Arg(comptime Id: type) type {
15 return struct { 3 return struct {
@@ -71,14 +59,14 @@ pub fn Clap(comptime Id: type, comptime ArgIterator: type) type {
71 const arg = arg_info.arg; 59 const arg = arg_info.arg;
72 switch (arg_info.kind) { 60 switch (arg_info.kind) {
73 .long => { 61 .long => {
74 const eql_index = mem.indexOfAny(u8, arg, parser.assignment_separators); 62 const eql_index = std.mem.indexOfAny(u8, arg, parser.assignment_separators);
75 const name = if (eql_index) |i| arg[0..i] else arg; 63 const name = if (eql_index) |i| arg[0..i] else arg;
76 const maybe_value = if (eql_index) |i| arg[i + 1 ..] else null; 64 const maybe_value = if (eql_index) |i| arg[i + 1 ..] else null;
77 65
78 for (parser.params) |*param| { 66 for (parser.params) |*param| {
79 const match = param.names.long orelse continue; 67 const match = param.names.long orelse continue;
80 68
81 if (!mem.eql(u8, name, match)) 69 if (!std.mem.eql(u8, name, match))
82 continue; 70 continue;
83 if (param.takes_value == .none) { 71 if (param.takes_value == .none) {
84 if (maybe_value != null) 72 if (maybe_value != null)
@@ -108,7 +96,7 @@ pub fn Clap(comptime Id: type, comptime ArgIterator: type) type {
108 // If we find a positional with the value `--` then we 96 // If we find a positional with the value `--` then we
109 // interpret the rest of the arguments as positional 97 // interpret the rest of the arguments as positional
110 // arguments. 98 // arguments.
111 if (mem.eql(u8, arg, "--")) { 99 if (std.mem.eql(u8, arg, "--")) {
112 parser.state = .rest_are_positional; 100 parser.state = .rest_are_positional;
113 const value = parser.iter.next() orelse return null; 101 const value = parser.iter.next() orelse return null;
114 return Arg(Id){ .param = param, .value = value }; 102 return Arg(Id){ .param = param, .value = value };
@@ -200,11 +188,11 @@ pub fn Clap(comptime Id: type, comptime ArgIterator: type) type {
200 188
201 fn parseNextArg(parser: *@This()) !?ArgInfo { 189 fn parseNextArg(parser: *@This()) !?ArgInfo {
202 const full_arg = parser.iter.next() orelse return null; 190 const full_arg = parser.iter.next() orelse return null;
203 if (mem.eql(u8, full_arg, "--") or mem.eql(u8, full_arg, "-")) 191 if (std.mem.eql(u8, full_arg, "--") or std.mem.eql(u8, full_arg, "-"))
204 return ArgInfo{ .arg = full_arg, .kind = .positional }; 192 return ArgInfo{ .arg = full_arg, .kind = .positional };
205 if (mem.startsWith(u8, full_arg, "--")) 193 if (std.mem.startsWith(u8, full_arg, "--"))
206 return ArgInfo{ .arg = full_arg[2..], .kind = .long }; 194 return ArgInfo{ .arg = full_arg[2..], .kind = .long };
207 if (mem.startsWith(u8, full_arg, "-")) 195 if (std.mem.startsWith(u8, full_arg, "-"))
208 return ArgInfo{ .arg = full_arg[1..], .kind = .short }; 196 return ArgInfo{ .arg = full_arg[1..], .kind = .short };
209 197
210 return ArgInfo{ .arg = full_arg, .kind = .positional }; 198 return ArgInfo{ .arg = full_arg, .kind = .positional };
@@ -219,18 +207,18 @@ pub fn Clap(comptime Id: type, comptime ArgIterator: type) type {
219} 207}
220 208
221fn expectArgs( 209fn expectArgs(
222 parser: *Clap(u8, args.SliceIterator), 210 parser: *Clap(u8, clap.args.SliceIterator),
223 results: []const Arg(u8), 211 results: []const Arg(u8),
224) !void { 212) !void {
225 for (results) |res| { 213 for (results) |res| {
226 const arg = (try parser.next()) orelse return error.TestFailed; 214 const arg = (try parser.next()) orelse return error.TestFailed;
227 try testing.expectEqual(res.param, arg.param); 215 try std.testing.expectEqual(res.param, arg.param);
228 const expected_value = res.value orelse { 216 const expected_value = res.value orelse {
229 try testing.expectEqual(@as(@TypeOf(arg.value), null), arg.value); 217 try std.testing.expectEqual(@as(@TypeOf(arg.value), null), arg.value);
230 continue; 218 continue;
231 }; 219 };
232 const actual_value = arg.value orelse return error.TestFailed; 220 const actual_value = arg.value orelse return error.TestFailed;
233 try testing.expectEqualSlices(u8, expected_value, actual_value); 221 try std.testing.expectEqualSlices(u8, expected_value, actual_value);
234 } 222 }
235 223
236 if (try parser.next()) |_| 224 if (try parser.next()) |_|
@@ -238,7 +226,7 @@ fn expectArgs(
238} 226}
239 227
240fn expectError( 228fn expectError(
241 parser: *Clap(u8, args.SliceIterator), 229 parser: *Clap(u8, clap.args.SliceIterator),
242 expected: []const u8, 230 expected: []const u8,
243) !void { 231) !void {
244 var diag: clap.Diagnostic = .{}; 232 var diag: clap.Diagnostic = .{};
@@ -246,13 +234,13 @@ fn expectError(
246 234
247 while (parser.next() catch |err| { 235 while (parser.next() catch |err| {
248 var buf: [1024]u8 = undefined; 236 var buf: [1024]u8 = undefined;
249 var fbs = io.fixedBufferStream(&buf); 237 var fbs = std.io.fixedBufferStream(&buf);
250 diag.report(fbs.writer(), err) catch return error.TestFailed; 238 diag.report(fbs.writer(), err) catch return error.TestFailed;
251 try testing.expectEqualStrings(expected, fbs.getWritten()); 239 try std.testing.expectEqualStrings(expected, fbs.getWritten());
252 return; 240 return;
253 }) |_| {} 241 }) |_| {}
254 242
255 try testing.expect(false); 243 try std.testing.expect(false);
256} 244}
257 245
258test "short params" { 246test "short params" {
@@ -276,12 +264,12 @@ test "short params" {
276 const c = &params[2]; 264 const c = &params[2];
277 const d = &params[3]; 265 const d = &params[3];
278 266
279 var iter = args.SliceIterator{ .args = &.{ 267 var iter = clap.args.SliceIterator{ .args = &.{
280 "-a", "-b", "-ab", "-ba", 268 "-a", "-b", "-ab", "-ba",
281 "-c", "0", "-c=0", "-ac", 269 "-c", "0", "-c=0", "-ac",
282 "0", "-ac=0", "-d=0", 270 "0", "-ac=0", "-d=0",
283 } }; 271 } };
284 var parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 272 var parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
285 273
286 try expectArgs(&parser, &.{ 274 try expectArgs(&parser, &.{
287 .{ .param = a }, 275 .{ .param = a },
@@ -321,12 +309,12 @@ test "long params" {
321 const cc = &params[2]; 309 const cc = &params[2];
322 const dd = &params[3]; 310 const dd = &params[3];
323 311
324 var iter = args.SliceIterator{ .args = &.{ 312 var iter = clap.args.SliceIterator{ .args = &.{
325 "--aa", "--bb", 313 "--aa", "--bb",
326 "--cc", "0", 314 "--cc", "0",
327 "--cc=0", "--dd=0", 315 "--cc=0", "--dd=0",
328 } }; 316 } };
329 var parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 317 var parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
330 318
331 try expectArgs(&parser, &.{ 319 try expectArgs(&parser, &.{
332 .{ .param = aa }, 320 .{ .param = aa },
@@ -343,11 +331,11 @@ test "positional params" {
343 .takes_value = .one, 331 .takes_value = .one,
344 }}; 332 }};
345 333
346 var iter = args.SliceIterator{ .args = &.{ 334 var iter = clap.args.SliceIterator{ .args = &.{
347 "aa", 335 "aa",
348 "bb", 336 "bb",
349 } }; 337 } };
350 var parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 338 var parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
351 339
352 try expectArgs(&parser, &.{ 340 try expectArgs(&parser, &.{
353 .{ .param = &params[0], .value = "aa" }, 341 .{ .param = &params[0], .value = "aa" },
@@ -378,14 +366,14 @@ test "all params" {
378 const cc = &params[2]; 366 const cc = &params[2];
379 const positional = &params[3]; 367 const positional = &params[3];
380 368
381 var iter = args.SliceIterator{ .args = &.{ 369 var iter = clap.args.SliceIterator{ .args = &.{
382 "-a", "-b", "-ab", "-ba", 370 "-a", "-b", "-ab", "-ba",
383 "-c", "0", "-c=0", "-ac", 371 "-c", "0", "-c=0", "-ac",
384 "0", "-ac=0", "--aa", "--bb", 372 "0", "-ac=0", "--aa", "--bb",
385 "--cc", "0", "--cc=0", "something", 373 "--cc", "0", "--cc=0", "something",
386 "-", "--", "--cc=0", "-a", 374 "-", "--", "--cc=0", "-a",
387 } }; 375 } };
388 var parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 376 var parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
389 377
390 try expectArgs(&parser, &.{ 378 try expectArgs(&parser, &.{
391 .{ .param = aa }, 379 .{ .param = aa },
@@ -422,11 +410,11 @@ test "different assignment separators" {
422 410
423 const aa = &params[0]; 411 const aa = &params[0];
424 412
425 var iter = args.SliceIterator{ .args = &.{ 413 var iter = clap.args.SliceIterator{ .args = &.{
426 "-a=0", "--aa=0", 414 "-a=0", "--aa=0",
427 "-a:0", "--aa:0", 415 "-a:0", "--aa:0",
428 } }; 416 } };
429 var parser = Clap(u8, args.SliceIterator){ 417 var parser = Clap(u8, clap.args.SliceIterator){
430 .params = &params, 418 .params = &params,
431 .iter = &iter, 419 .iter = &iter,
432 .assignment_separators = "=:", 420 .assignment_separators = "=:",
@@ -453,35 +441,38 @@ test "errors" {
453 }, 441 },
454 }; 442 };
455 443
456 var iter = args.SliceIterator{ .args = &.{"q"} }; 444 var iter = clap.args.SliceIterator{ .args = &.{"q"} };
457 var parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 445 var parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
458 try expectError(&parser, "Invalid argument 'q'\n"); 446 try expectError(&parser, "Invalid argument 'q'\n");
459 447
460 iter = args.SliceIterator{ .args = &.{"-q"} }; 448 iter = clap.args.SliceIterator{ .args = &.{"-q"} };
461 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 449 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
462 try expectError(&parser, "Invalid argument '-q'\n"); 450 try expectError(&parser, "Invalid argument '-q'\n");
463 451
464 iter = args.SliceIterator{ .args = &.{"--q"} }; 452 iter = clap.args.SliceIterator{ .args = &.{"--q"} };
465 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 453 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
466 try expectError(&parser, "Invalid argument '--q'\n"); 454 try expectError(&parser, "Invalid argument '--q'\n");
467 455
468 iter = args.SliceIterator{ .args = &.{"--q=1"} }; 456 iter = clap.args.SliceIterator{ .args = &.{"--q=1"} };
469 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 457 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
470 try expectError(&parser, "Invalid argument '--q'\n"); 458 try expectError(&parser, "Invalid argument '--q'\n");
471 459
472 iter = args.SliceIterator{ .args = &.{"-a=1"} }; 460 iter = clap.args.SliceIterator{ .args = &.{"-a=1"} };
473 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 461 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
474 try expectError(&parser, "The argument '-a' does not take a value\n"); 462 try expectError(&parser, "The argument '-a' does not take a value\n");
475 463
476 iter = args.SliceIterator{ .args = &.{"--aa=1"} }; 464 iter = clap.args.SliceIterator{ .args = &.{"--aa=1"} };
477 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 465 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
478 try expectError(&parser, "The argument '--aa' does not take a value\n"); 466 try expectError(&parser, "The argument '--aa' does not take a value\n");
479 467
480 iter = args.SliceIterator{ .args = &.{"-c"} }; 468 iter = clap.args.SliceIterator{ .args = &.{"-c"} };
481 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 469 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
482 try expectError(&parser, "The argument '-c' requires a value but none was supplied\n"); 470 try expectError(&parser, "The argument '-c' requires a value but none was supplied\n");
483 471
484 iter = args.SliceIterator{ .args = &.{"--cc"} }; 472 iter = clap.args.SliceIterator{ .args = &.{"--cc"} };
485 parser = Clap(u8, args.SliceIterator){ .params = &params, .iter = &iter }; 473 parser = Clap(u8, clap.args.SliceIterator){ .params = &params, .iter = &iter };
486 try expectError(&parser, "The argument '--cc' requires a value but none was supplied\n"); 474 try expectError(&parser, "The argument '--cc' requires a value but none was supplied\n");
487} 475}
476
477const clap = @import("../clap.zig");
478const std = @import("std");