Factor out tag-to-valueclass

This commit is contained in:
Tony Garnock-Jones 2022-11-09 09:37:34 +01:00
parent 8369d9c4f6
commit b0549b3f83
1 changed files with 30 additions and 19 deletions

View File

@ -249,29 +249,40 @@ impl<'de, S: BinarySource<'de>> PackedReader<'de, S> {
}
}
impl From<Tag> for Option<NextToken> {
#[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<Option<NextToken>> {
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")),
}
}