blob: 986af5878791f67fbc91a901226164b6bbffd91a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;
}
|