Factor out ShortU16 deser vistor logic to helper

This commit is contained in:
Trent Nelson
2020-08-13 22:19:01 -06:00
committed by Trent Nelson
parent 338f66f9aa
commit 6222fbcc66

View File

@ -38,6 +38,26 @@ impl Serialize for ShortU16 {
} }
} }
enum VisitResult {
Done(usize, usize),
More(usize, usize),
Err,
}
fn visit_byte(elem: u8, len: usize, size: usize) -> VisitResult {
let len = len | (elem as usize & 0x7f) << (size * 7);
let size = size + 1;
let more = elem as usize & 0x80 == 0x80;
if size > size_of::<u16>() + 1 {
VisitResult::Err
} else if more {
VisitResult::More(len, size)
} else {
VisitResult::Done(len, size)
}
}
struct ShortLenVisitor; struct ShortLenVisitor;
impl<'de> Visitor<'de> for ShortLenVisitor { impl<'de> Visitor<'de> for ShortLenVisitor {
@ -58,15 +78,16 @@ impl<'de> Visitor<'de> for ShortLenVisitor {
.next_element()? .next_element()?
.ok_or_else(|| de::Error::invalid_length(size, &self))?; .ok_or_else(|| de::Error::invalid_length(size, &self))?;
len |= (elem as usize & 0x7f) << (size * 7); match visit_byte(elem, len, size) {
size += 1; VisitResult::Done(l, _) => {
len = l;
if elem as usize & 0x80 == 0 { break;
break; }
} VisitResult::More(l, s) => {
len = l;
if size > size_of::<u16>() + 1 { size = s;
return Err(de::Error::invalid_length(size, &self)); }
VisitResult::Err => return Err(de::Error::invalid_length(size + 1, &self)),
} }
} }