diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-01 12:47:35 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-02-01 12:47:35 +0100 |
| commit | 85bcada8cf78bdf2bfb3be583289686026e0f25e (patch) | |
| tree | 0ce404c4840432db9b6d3addd3947a736d103382 /src/estd/parser/common.zig | |
| parent | 2ce14aec655589f00442ab469b9d877a143eeefd (diff) | |
screen: start drm implementation
Diffstat (limited to 'src/estd/parser/common.zig')
| -rw-r--r-- | src/estd/parser/common.zig | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/estd/parser/common.zig b/src/estd/parser/common.zig new file mode 100644 index 0000000..986af58 --- /dev/null +++ b/src/estd/parser/common.zig @@ -0,0 +1,28 @@ +const std = @import("std"); +const root = @import("root.zig"); +const Context = @import("context.zig").Context; +const ParseFn = root.ParseFn; + +pub fn LiteralFn(comptime I: type, comptime O: type) type { + return *const fn (comptime literal: []const I, value: O) ParseFn(I, O); +} + +pub fn Literal(comptime I: type, comptime O: type) LiteralFn(I, O) { + return struct { + pub fn literal(comptime lit: []const I, value: O) ParseFn(I, O) { + return struct { + pub fn parse(ctx: *Context(I)) !O { + const snapshot = ctx.cursor.snapshot(); + errdefer ctx.cursor.rollback(snapshot); + + const slice = try ctx.cursor.consume(lit.len); + if (std.mem.eql(I, lit, slice)) { + return value; + } + + return error.UnexpectedLiteral; + } + }.parse; + } + }.literal; +} |