diff --git a/implementations/rust/preserves/src/value/text/reader.rs b/implementations/rust/preserves/src/value/text/reader.rs index a9b3533..9feda60 100644 --- a/implementations/rust/preserves/src/value/text/reader.rs +++ b/implementations/rust/preserves/src/value/text/reader.rs @@ -313,6 +313,18 @@ impl<'de, 'src, N: NestedValue, Dec: DomainParse, S: BinarySource<' } } + fn read_set(&mut self, read_annotations: bool) -> io::Result { + let items = self.upto(b'}', read_annotations)?; + let mut s = Set::::new(); + for i in items { + if s.contains(&i) { + return Err(io_syntax_error("Duplicate set element")); + } + s.insert(i); + } + Ok(N::new(s)) + } + fn read_dictionary(&mut self, read_annotations: bool) -> io::Result { let mut d = Map::new(); loop { @@ -326,6 +338,9 @@ impl<'de, 'src, N: NestedValue, Dec: DomainParse, S: BinarySource<' if self.next_byte()? != b':' { return Err(io_syntax_error("Missing expected key/value separator")); } + if d.contains_key(&k) { + return Err(io_syntax_error("Duplicate key")); + } let v = Reader::::demand_next(self, read_annotations)?; d.insert(k, v); } @@ -392,13 +407,12 @@ impl<'de, 'src, N: NestedValue, Dec: DomainParse, S: BinarySource<' for TextReader<'de, 'src, N, Dec, S> { fn next(&mut self, read_annotations: bool) -> io::Result> { - self.skip_whitespace(); - let c = match self.peek() { - Ok(c) => c, + match self.peek() { Err(e) if is_eof_io_error(&e) => return Ok(None), - Err(e) => return Err(e.into()), - }; - Ok(Some(match c { + _ => (), + } + self.skip_whitespace(); + Ok(Some(match self.peek()? { b'"' => { self.skip()?; N::new(self.read_string(b'"')?) @@ -429,9 +443,7 @@ impl<'de, 'src, N: NestedValue, Dec: DomainParse, S: BinarySource<' match self.next_byte()? { b'f' => N::new(false), b't' => N::new(true), - b'{' => N::new(Set::from_iter( - self.upto(b'}', read_annotations)?.into_iter(), - )), + b'{' => self.read_set(read_annotations)?, b'"' => self.read_literal_binary()?, b'x' => match self.next_byte()? { b'"' => N::new(&self.read_hex_binary()?[..]),