Factor out ShortU16 deser vistor logic to helper
This commit is contained in:
committed by
Trent Nelson
parent
338f66f9aa
commit
6222fbcc66
@ -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) => {
|
||||||
if size > size_of::<u16>() + 1 {
|
len = l;
|
||||||
return Err(de::Error::invalid_length(size, &self));
|
size = s;
|
||||||
|
}
|
||||||
|
VisitResult::Err => return Err(de::Error::invalid_length(size + 1, &self)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user