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; }