diff --git a/schala-lang/language/src/parser.rs b/schala-lang/language/src/parser.rs index 5c5538e..e7db2fc 100644 --- a/schala-lang/language/src/parser.rs +++ b/schala-lang/language/src/parser.rs @@ -276,7 +276,23 @@ fn tuple_struct_pattern(text: &str) -> ParseResult { } fn record_pattern(text: &str) -> ParseResult { - unimplemented!() + let p = tuple(( + qualified_name, + delimited(ws(tag("{")), + separated_nonempty_list(ws(tag(",")), ws(record_pattern_entry)), //TODO support newlines? + ws(tag("}"))) + )); + map(p, |(name, members)| Pattern::Record(name, members))(text) +} + +fn record_pattern_entry(text: &str) -> ParseResult<(Rc, Pattern)> { + alt(( + map(tuple((ws(identifier), ws(tag(":")), ws(pattern))), + |(name, _, pattern)| (name, pattern)), + map(identifier, |name| + (name.clone(), Pattern::Literal(PatternLiteral::StringPattern(name.clone()))) + ) + ))(text) } fn pattern_literal(text: &str) -> ParseResult {