use std::io::Read;
#[inline]
pub fn leb64_from_read(mut r: impl Read) -> Result<(u64, usize), std::io::Error> {
let mut byte = [0u8; 1];
r.read_exact(&mut byte)?;
let mut c = byte[0];
let mut i = 1;
let mut value = u64::from(c) & 0x7f;
while c & 0x80 != 0 {
r.read_exact(&mut byte)?;
c = byte[0];
i += 1;
value = value
.checked_add(1)
.and_then(|value| value.checked_shl(7))
.and_then(|value| value.checked_add(u64::from(c) & 0x7f))
.ok_or_else(|| std::io::Error::new(std::io::ErrorKind::InvalidData, "LEB64 value overflowed"))?;
}
Ok((value, i))
}