Skip to content

Commit

Permalink
refactor: Replace ArgParser with the one from dipm
Browse files Browse the repository at this point in the history
  • Loading branch information
Hejsil committed Aug 28, 2024
1 parent 3e50f5c commit 8d63b9f
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 108 deletions.
105 changes: 75 additions & 30 deletions src/ArgParser.zig
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
args: []const []const u8,
index: usize = 0,

pub fn isDone(parser: ArgParser) bool {
return parser.index >= parser.args.len;
consumed: bool = false,

pub fn next(parser: *ArgParser) bool {
parser.consumed = parser.index >= parser.args.len;
return !parser.consumed;
}

pub fn flag(parser: *ArgParser, names: []const []const u8) bool {
if (parser.consumed)
return false;

for (names) |name| {
if (!std.mem.eql(u8, parser.args[parser.index], name))
continue;

parser.consumed = true;
parser.index += 1;
return true;
}
Expand All @@ -18,13 +25,17 @@ pub fn flag(parser: *ArgParser, names: []const []const u8) bool {
}

pub fn option(parser: *ArgParser, names: []const []const u8) ?[]const u8 {
if (parser.consumed)
return null;

const arg = parser.args[parser.index];
for (names) |name| {
if (!std.mem.startsWith(u8, arg, name))
continue;
if (!std.mem.startsWith(u8, arg[name.len..], "="))
continue;

parser.consumed = true;
parser.index += 1;
return arg[name.len + 1 ..];
}
Expand All @@ -37,7 +48,14 @@ pub fn option(parser: *ArgParser, names: []const []const u8) ?[]const u8 {
return null;
}

pub fn eat(parser: *ArgParser) []const u8 {
pub fn positional(parser: *ArgParser) ?[]const u8 {
if (parser.consumed)
return null;

return parser.eat();
}

fn eat(parser: *ArgParser) []const u8 {
defer parser.index += 1;
return parser.args[parser.index];
}
Expand All @@ -47,16 +65,24 @@ test flag {
"-a", "--beta", "command",
} };

try std.testing.expect(!parser.flag(&.{"command"}));
try std.testing.expect(!parser.flag(&.{ "-b", "--beta" }));
try std.testing.expect(parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try std.testing.expect(!parser.flag(&.{ "-b", "--beta" }));
try std.testing.expect(!parser.flag(&.{"command"}));

try std.testing.expect(parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(parser.flag(&.{ "-b", "--beta" }));
try std.testing.expect(!parser.isDone());
try std.testing.expect(!parser.flag(&.{"command"}));

try std.testing.expect(parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.flag(&.{ "-b", "--beta" }));
try std.testing.expect(parser.flag(&.{"command"}));
try std.testing.expect(parser.isDone());

try std.testing.expect(!parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.flag(&.{ "-b", "--beta" }));
try std.testing.expect(!parser.flag(&.{"command"}));
}

fn expectEqualOptionalString(m_expect: ?[]const u8, m_actual: ?[]const u8) !void {
Expand All @@ -77,31 +103,40 @@ test option {
"command_value",
} };

try expectEqualOptionalString(null, parser.option(&.{"command"}));
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString("a_value", parser.option(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{"command"}));

try std.testing.expect(parser.next());
try expectEqualOptionalString(null, parser.option(&.{ "-a", "--alpha" }));
try expectEqualOptionalString("b_value", parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{"command"}));

try std.testing.expect(parser.next());
try expectEqualOptionalString(null, parser.option(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString("command_value", parser.option(&.{"command"}));
try std.testing.expect(parser.isDone());

try std.testing.expect(!parser.next());
try expectEqualOptionalString(null, parser.option(&.{ "-a", "--alpha" }));
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{"command"}));
}

test eat {
test positional {
var parser = ArgParser{ .args = &.{
"-a",
"--beta",
"command",
} };

try std.testing.expectEqualStrings("-a", parser.eat());
try std.testing.expect(!parser.isDone());
try std.testing.expectEqualStrings("--beta", parser.eat());
try std.testing.expect(!parser.isDone());
try std.testing.expectEqualStrings("command", parser.eat());
try std.testing.expect(parser.isDone());
try expectEqualOptionalString("-a", parser.positional());
try std.testing.expect(parser.next());
try expectEqualOptionalString("--beta", parser.positional());
try std.testing.expect(parser.next());
try expectEqualOptionalString("command", parser.positional());
try std.testing.expect(!parser.next());
try expectEqualOptionalString(null, parser.positional());
}

test "all" {
Expand All @@ -113,24 +148,34 @@ test "all" {
"command",
} };

try expectEqualOptionalString(null, parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try std.testing.expect(parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.positional());

try std.testing.expect(parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try expectEqualOptionalString("b_value", parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.positional());

try std.testing.expect(parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try expectEqualOptionalString("c_value", parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString("c_value", parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.positional());

try std.testing.expect(parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try expectEqualOptionalString(null, parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString("command", parser.positional());

try std.testing.expect(!parser.next());
try std.testing.expect(!parser.flag(&.{ "-a", "--alpha" }));
try std.testing.expect(!parser.isDone());
try std.testing.expectEqualStrings("command", parser.eat());
try std.testing.expect(parser.isDone());
try expectEqualOptionalString(null, parser.option(&.{ "-b", "--beta" }));
try expectEqualOptionalString(null, parser.option(&.{ "-c", "--center" }));
try expectEqualOptionalString(null, parser.positional());
}

const ArgParser = @This();
Expand Down
Loading

0 comments on commit 8d63b9f

Please sign in to comment.