diff --git a/implementations/rust/oo/src/packed/reader.rs b/implementations/rust/oo/src/packed/reader.rs index cbfbf01..f00aec6 100644 --- a/implementations/rust/oo/src/packed/reader.rs +++ b/implementations/rust/oo/src/packed/reader.rs @@ -249,29 +249,40 @@ impl<'de, S: BinarySource<'de>> PackedReader<'de, S> { } } +impl From for Option { + #[inline(always)] + fn from(tag: Tag) -> Self { + match tag { + Tag::False => Some(NextToken::Value(ValueClass::Atomic(AtomClass::Boolean))), + Tag::True => Some(NextToken::Value(ValueClass::Atomic(AtomClass::Boolean))), + Tag::Float => Some(NextToken::Value(ValueClass::Atomic(AtomClass::Float))), + Tag::Double => Some(NextToken::Value(ValueClass::Atomic(AtomClass::Double))), + Tag::Annotation => Some(NextToken::Annotation), + Tag::Embedded => Some(NextToken::Value(ValueClass::Embedded)), + Tag::SmallInteger(_) => Some(NextToken::Value(ValueClass::Atomic(AtomClass::SignedInteger))), + Tag::MediumInteger(_) => Some(NextToken::Value(ValueClass::Atomic(AtomClass::SignedInteger))), + Tag::SignedInteger => Some(NextToken::Value(ValueClass::Atomic(AtomClass::SignedInteger))), + Tag::String => Some(NextToken::Value(ValueClass::Atomic(AtomClass::String))), + Tag::ByteString => Some(NextToken::Value(ValueClass::Atomic(AtomClass::ByteString))), + Tag::Symbol => Some(NextToken::Value(ValueClass::Atomic(AtomClass::Symbol))), + Tag::Record => Some(NextToken::Value(ValueClass::Compound(CompoundClass::Record))), + Tag::Sequence => Some(NextToken::Value(ValueClass::Compound(CompoundClass::Sequence))), + Tag::Set => Some(NextToken::Value(ValueClass::Compound(CompoundClass::Set))), + Tag::Dictionary => Some(NextToken::Value(ValueClass::Compound(CompoundClass::Dictionary))), + Tag::End => None, + } + } +} + impl<'de, S: BinarySource<'de>> Reader<'de> for PackedReader<'de, S> { fn peek_class(&mut self) -> io::Result> { - match Tag::try_from(match self.peek()? { + let tag = Tag::try_from(match self.peek()? { None => return Ok(None), Some(b) => b, - })? { - Tag::False => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::Boolean)))), - Tag::True => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::Boolean)))), - Tag::Float => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::Float)))), - Tag::Double => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::Double)))), - Tag::Annotation => Ok(Some(NextToken::Annotation)), - Tag::Embedded => Ok(Some(NextToken::Value(ValueClass::Embedded))), - Tag::SmallInteger(_) => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::SignedInteger)))), - Tag::MediumInteger(_) => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::SignedInteger)))), - Tag::SignedInteger => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::SignedInteger)))), - Tag::String => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::String)))), - Tag::ByteString => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::ByteString)))), - Tag::Symbol => Ok(Some(NextToken::Value(ValueClass::Atomic(AtomClass::Symbol)))), - Tag::Record => Ok(Some(NextToken::Value(ValueClass::Compound(CompoundClass::Record)))), - Tag::Sequence => Ok(Some(NextToken::Value(ValueClass::Compound(CompoundClass::Sequence)))), - Tag::Set => Ok(Some(NextToken::Value(ValueClass::Compound(CompoundClass::Set)))), - Tag::Dictionary => Ok(Some(NextToken::Value(ValueClass::Compound(CompoundClass::Dictionary)))), - tag @ Tag::End => Err(self.syntax_error(&format!("Invalid tag: {:?}", tag))), + })?; + match tag.into() { + Some(n) => Ok(Some(n)), + None => Err(self.syntax_error("Unexpected tag")), } }