From 511f25602275f54ccfb3b3584c231f1f0d9e1514 Mon Sep 17 00:00:00 2001 From: Axy Date: Sat, 28 Mar 2026 21:18:44 +0100 Subject: [PATCH] Slightly better error messages for key parser --- .gitignore | 2 +- mazegen/config/config_parser.py | 30 ++++++++++++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 1da5078..a388820 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ out.prof prof.svg tmp .venv -dist +test diff --git a/mazegen/config/config_parser.py b/mazegen/config/config_parser.py index c59b2b9..3d54558 100644 --- a/mazegen/config/config_parser.py +++ b/mazegen/config/config_parser.py @@ -23,6 +23,7 @@ from .parser_combinator import ( pair, parser_complete, parser_map, + parser_map_err, preceeded, recognize, seq, @@ -329,19 +330,24 @@ PatternField = ListParser(parse_str_line) def line_parser[T]( fields: dict[str, ConfigField[T]], ) -> Parser[tuple[str, T] | None]: - return alt( - parser_map(lambda _: None, parse_comment), - *( - preceeded( - seq(tag(name), multispace0, tag("="), multispace0), - parser_map( - (lambda name: lambda res: (name, res))(name), - cut(terminated(field.parse, multispace0)), - ), - ) - for name, field in fields.items() + return parser_map_err( + lambda e: ParseError("Expected valid field name", e.at), + alt( + parser_map(lambda _: None, parse_comment), + *( + preceeded( + seq(tag(name), multispace0, cut(tag("=")), multispace0), + parser_map( + (lambda name: lambda res: (name, res))(name), + cut(terminated(field.parse, multispace0)), + ), + ) + for name, field in fields.items() + ), + parser_map( + lambda _: None, lookahead_parser(null_parser, tag("\n")) + ), ), - parser_map(lambda _: None, lookahead_parser(null_parser, tag("\n"))), ) -- 2.53.0