diff --git a/src/parser/parser.test.ts b/src/parser/parser.test.ts index a751bac..c84fda6 100644 --- a/src/parser/parser.test.ts +++ b/src/parser/parser.test.ts @@ -46,6 +46,15 @@ Description: `); }); + it("throws error for unknown labels", () => { + expect(() => + parse(` +Name: Strange workout +Level: Advanced +`), + ).toThrowErrorMatchingInlineSnapshot(`"Unknown label \\"Level:\\" at line 3 char 1"`); + }); + it("parses basic intervals", () => { expect( parse(` diff --git a/src/parser/tokenizer.ts b/src/parser/tokenizer.ts index 519df8f..f29f4ac 100644 --- a/src/parser/tokenizer.ts +++ b/src/parser/tokenizer.ts @@ -117,22 +117,14 @@ const tokenizeComment = (line: string, row: number): Token[] | undefined => { ]; }; -const tokenizeRule = (line: string, row: number): Token[] => { - const commentTokens = tokenizeComment(line, row); - if (commentTokens) { - return commentTokens; +const tokenizeLabelToken = (line: string, row: number): Token[] | undefined => { + const [, label, separator, paramString] = line.match(/^(\w+)(:\s*)(.*?)\s*$/) || []; + if (!label) { + return undefined; } - - const matches = line.match(/^(\w+)(:\s*)(.*?)\s*$/); - if (!matches) { - return [{ type: "text", value: line.trim(), loc: { row, col: 0 } }]; + if (!isLabelTokenValue(label)) { + throw new ParseError(`Unknown label "${label}:"`, { row, col: 0 }); } - if (!isLabelTokenValue(matches[1])) { - return [{ type: "text", value: line.trim(), loc: { row, col: 0 } }]; - } - - const [, label, separator, paramString] = matches; - const labelToken: LabelToken = { type: "label", value: label as LabelTokenValue, @@ -142,10 +134,16 @@ const tokenizeRule = (line: string, row: number): Token[] => { row, col: label.length + separator.length, }); - return [labelToken, ...params]; }; +const tokenizeRule = (line: string, row: number): Token[] => { + return ( + tokenizeLabelToken(line, row) || + tokenizeComment(line, row) || [{ type: "text", value: line.trim(), loc: { row, col: 0 } }] + ); +}; + export const tokenize = (file: string): Token[] => { const tokens: Token[] = [];