Factor out tag-to-valueclass
This commit is contained in:
parent
8369d9c4f6
commit
b0549b3f83
|
@ -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")),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue