-
Notifications
You must be signed in to change notification settings - Fork 3
/
literal-parser.ts
executable file
·38 lines (35 loc) · 1.08 KB
/
literal-parser.ts
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
29
30
31
32
33
34
35
36
37
38
import { IParser, OnParse } from "./interfaces.ts";
import { Parser } from "./parser.ts";
import { OneOf } from "./utils.ts";
export class LiteralsParser<B extends unknown[]>
implements IParser<unknown, OneOf<B>> {
constructor(
readonly values: B,
readonly description = {
name: "Literal",
children: [],
extras: values,
} as const,
) {}
parse<C, D>(a: unknown, onParse: OnParse<unknown, OneOf<B>, C, D>): C | D {
if (this.values.indexOf(a) >= 0) {
return onParse.parsed(a as OneOf<B>);
}
return onParse.invalid({
value: a,
keys: [],
parser: this,
});
}
}
export function literal<A extends string | number | boolean | null | undefined>(
isEqualToValue: A,
) {
return new Parser(new LiteralsParser<[A]>([isEqualToValue]));
}
export function literals<
A extends string | number | boolean | null | undefined,
Rest extends Array<string | number | boolean | null | undefined>,
>(firstValue: A, ...restValues: Rest): Parser<unknown, A | OneOf<Rest>> {
return new Parser(new LiteralsParser([firstValue, ...restValues]));
}