From 9c8489ced73586685c5025db44039c0caba4c0b4 Mon Sep 17 00:00:00 2001 From: Natty Date: Sat, 30 Dec 2023 19:23:32 +0100 Subject: [PATCH] MMM: Correctly parse empty strings Surely I wouldn't forget to do that, right? --- magnetar_mmm_parser/src/lib.rs | 51 ++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/magnetar_mmm_parser/src/lib.rs b/magnetar_mmm_parser/src/lib.rs index c21572c..215c439 100644 --- a/magnetar_mmm_parser/src/lib.rs +++ b/magnetar_mmm_parser/src/lib.rs @@ -718,40 +718,54 @@ impl Context { } pub fn full<'a>(&self, input: Span<'a>) -> IResult, Token> { - map(many1(self.partial(Self::full_single)), Token::Sequence)(input) + map( + many_till(self.partial(Self::full_single), eof).map(|v| v.0), + Token::Sequence, + )(input) } pub fn inline<'a>(&self, input: Span<'a>) -> IResult, Token> { - map(many1(self.partial(Self::inline_single)), Token::Sequence)(input) + map( + many_till(self.partial(Self::inline_single), eof).map(|v| v.0), + Token::Sequence, + )(input) } pub fn inline_label_safe<'a>(&self, input: Span<'a>) -> IResult, Token> { map( - many1(self.partial(Self::inline_label_safe_single)), + many_till(self.partial(Self::inline_label_safe_single), eof).map(|v| v.0), Token::Sequence, )(input) } fn inline_profile_fields<'a>(&self, input: Span<'a>) -> IResult, Token> { map( - many1(alt(( - self.partial(Self::unicode_emoji), - self.partial(Self::tag_mention), - self.partial(Self::tag_hashtag), - self.partial(Self::raw_url), - self.partial(Self::tag_raw_text), - ))), + many_till( + alt(( + self.partial(Self::unicode_emoji), + self.partial(Self::tag_mention), + self.partial(Self::tag_hashtag), + self.partial(Self::raw_url), + self.partial(Self::tag_raw_text), + )), + eof, + ) + .map(|v| v.0), Token::Sequence, )(input) } fn inline_ui<'a>(&self, input: Span<'a>) -> IResult, Token> { map( - many1(alt(( - self.partial(Self::unicode_emoji), - self.partial(Self::shortcode_emoji), - self.partial(Self::tag_raw_text), - ))), + many_till( + alt(( + self.partial(Self::unicode_emoji), + self.partial(Self::shortcode_emoji), + self.partial(Self::tag_raw_text), + )), + eof, + ) + .map(|v| v.0), Token::Sequence, )(input) } @@ -1709,6 +1723,13 @@ mod test { .merged() } + #[test] + fn parse_empty() { + let ctx = Context::default(); + + assert_eq!(parse_full(""), Token::Sequence(vec![])); + } + #[test] fn parse_url_chars() { let ctx = Context::default();