From 6d6c2a6d20c42ec0198b245f26cea0d08d615c08 Mon Sep 17 00:00:00 2001 From: Vladislav Mamon Date: Mon, 4 Jul 2022 17:17:23 +0500 Subject: [PATCH] feat(parsers/oneOf): add `oneOf` parser --- src/parsers.ts | 1 + src/parsers/oneOf.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/parsers/oneOf.ts diff --git a/src/parsers.ts b/src/parsers.ts index 850b6a3..16b9513 100644 --- a/src/parsers.ts +++ b/src/parsers.ts @@ -6,6 +6,7 @@ export * from './parsers/float' export * from './parsers/integer' export * from './parsers/letter' export * from './parsers/nothing' +export * from './parsers/oneOf' export * from './parsers/regexp' export * from './parsers/rest' export * from './parsers/run' diff --git a/src/parsers/oneOf.ts b/src/parsers/oneOf.ts new file mode 100644 index 0000000..906a01c --- /dev/null +++ b/src/parsers/oneOf.ts @@ -0,0 +1,26 @@ +import { type Parser } from '../state' + +export function oneOf(chars: string): Parser { + const charset = [...chars] + + return { + parse(input, pos) { + const nextPos = pos + 1 + const char = input.substring(pos, nextPos) + + if (charset.includes(char)) { + return { + isOk: true, + pos: nextPos, + value: char + } + } + + return { + isOk: false, + pos, + expected: `one of: ${charset.join(', ')}` + } + } + } +}