diff --git a/prost-reflect-tests/src/text_format.rs b/prost-reflect-tests/src/text_format.rs index 4257a0ee..0d2ca8cf 100644 --- a/prost-reflect-tests/src/text_format.rs +++ b/prost-reflect-tests/src/text_format.rs @@ -502,7 +502,7 @@ fn parse_aliased_enum() { #[test] fn parse_array() { - let value: ScalarArrays = from_text("double: [1.1, 2f] , float: 3 ; float: inf"); + let value: ScalarArrays = from_text("double: [1.1, 2f] , float: 3 ; float: inf ; int32: [ ]"); assert_eq!( value, ScalarArrays { @@ -557,6 +557,7 @@ fn parse_complex_type() { my_enum: [DEFAULT, FOO] my_enum: [2, BAR] my_enum: NEG + my_enum: [] optional_enum: FOO ", ); diff --git a/prost-reflect/src/dynamic/text_format/parse/mod.rs b/prost-reflect/src/dynamic/text_format/parse/mod.rs index 5354224e..3281d5c9 100644 --- a/prost-reflect/src/dynamic/text_format/parse/mod.rs +++ b/prost-reflect/src/dynamic/text_format/parse/mod.rs @@ -250,7 +250,16 @@ impl<'a> Parser<'a> { Some((Token::LeftBracket, _)) => { let start = self.bump(); - let mut result = vec![self.parse_value(kind)?.0]; + let mut result = Vec::new(); + + // Check for empty list first + if let Some((Token::RightBracket, _)) = self.peek()? { + let end = self.bump(); + return Ok((Value::List(result), join_span(start, end))); + } + + result.push(self.parse_value(kind)?.0); + loop { match self.peek()? { Some((Token::Comma, _)) => {