|
|
@@ -42,112 +42,77 @@ pub impl ReaderImpl of ReaderTrait {
|
|
|
}
|
|
|
|
|
|
/// Reads the specified number of bytes (up to 16) as a big endian unsigned integer.
|
|
|
- fn read_num_bytes(ref self: Reader, num_bytes: u8) -> Result<u128, Error> {
|
|
|
+ fn read_num_bytes(ref self: Reader, num_bytes: u8) -> u128 {
|
|
|
assert!(num_bytes <= 16, "Reader::read_num_bytes: num_bytes is too large");
|
|
|
if num_bytes <= self.num_current_bytes {
|
|
|
- let x = self.read_from_current(num_bytes);
|
|
|
- return Result::Ok(x);
|
|
|
+ return self.read_from_current(num_bytes);
|
|
|
}
|
|
|
let num_low_bytes = num_bytes - self.num_current_bytes;
|
|
|
let high = self.current;
|
|
|
- self.fetch_next()?;
|
|
|
- let low = self.read_num_bytes(num_low_bytes)?;
|
|
|
- let value = if num_low_bytes == 16 {
|
|
|
+ self.fetch_next();
|
|
|
+ let low = self.read_num_bytes(num_low_bytes);
|
|
|
+ if num_low_bytes == 16 {
|
|
|
low
|
|
|
} else {
|
|
|
high * one_shift_left_bytes_u128(num_low_bytes) + low
|
|
|
- };
|
|
|
- Result::Ok(value)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- fn read_u256(ref self: Reader) -> Result<u256, Error> {
|
|
|
- let high = self.read_num_bytes(16)?;
|
|
|
- let low = self.read_num_bytes(16)?;
|
|
|
+ fn read_u256(ref self: Reader) -> u256 {
|
|
|
+ let high = self.read_num_bytes(16);
|
|
|
+ let low = self.read_num_bytes(16);
|
|
|
let value = u256 { high, low };
|
|
|
- Result::Ok(value)
|
|
|
+ value
|
|
|
}
|
|
|
- fn read_u160(ref self: Reader) -> Result<u256, Error> {
|
|
|
- let high = self.read_num_bytes(4)?;
|
|
|
- let low = self.read_num_bytes(16)?;
|
|
|
- let value = u256 { high, low };
|
|
|
- Result::Ok(value)
|
|
|
+ fn read_u160(ref self: Reader) -> u256 {
|
|
|
+ let high = self.read_num_bytes(4);
|
|
|
+ let low = self.read_num_bytes(16);
|
|
|
+ u256 { high, low }
|
|
|
}
|
|
|
- fn read_u128(ref self: Reader) -> Result<u128, Error> {
|
|
|
+ fn read_u128(ref self: Reader) -> u128 {
|
|
|
self.read_num_bytes(16)
|
|
|
}
|
|
|
- fn read_u64(ref self: Reader) -> Result<u64, Error> {
|
|
|
- let value = self.read_num_bytes(8)?.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
- Result::Ok(value)
|
|
|
+ fn read_u64(ref self: Reader) -> u64 {
|
|
|
+ self.read_num_bytes(8).try_into().expect(UNEXPECTED_OVERFLOW)
|
|
|
}
|
|
|
- fn read_u32(ref self: Reader) -> Result<u32, Error> {
|
|
|
- let value = self.read_num_bytes(4)?.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
- Result::Ok(value)
|
|
|
+ fn read_u32(ref self: Reader) -> u32 {
|
|
|
+ self.read_num_bytes(4).try_into().expect(UNEXPECTED_OVERFLOW)
|
|
|
}
|
|
|
- fn read_u16(ref self: Reader) -> Result<u16, Error> {
|
|
|
- let value = self.read_num_bytes(2)?.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
- Result::Ok(value)
|
|
|
+ fn read_u16(ref self: Reader) -> u16 {
|
|
|
+ self.read_num_bytes(2).try_into().expect(UNEXPECTED_OVERFLOW)
|
|
|
}
|
|
|
- fn read_u8(ref self: Reader) -> Result<u8, Error> {
|
|
|
- let value = self.read_num_bytes(1)?.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
- Result::Ok(value)
|
|
|
+ fn read_u8(ref self: Reader) -> u8 {
|
|
|
+ self.read_num_bytes(1).try_into().expect(UNEXPECTED_OVERFLOW)
|
|
|
}
|
|
|
|
|
|
// TODO: skip without calculating values
|
|
|
- fn skip(ref self: Reader, mut num_bytes: u8) -> Result<(), Error> {
|
|
|
- let mut result = Result::Ok(());
|
|
|
+ fn skip(ref self: Reader, mut num_bytes: u8) {
|
|
|
while num_bytes > 0 {
|
|
|
if num_bytes > 16 {
|
|
|
- match self.read_num_bytes(16) {
|
|
|
- Result::Ok(_) => {},
|
|
|
- Result::Err(err) => {
|
|
|
- result = Result::Err(err);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ self.read_num_bytes(16);
|
|
|
num_bytes -= 16;
|
|
|
} else {
|
|
|
- match self.read_num_bytes(num_bytes) {
|
|
|
- Result::Ok(_) => {},
|
|
|
- Result::Err(err) => {
|
|
|
- result = Result::Err(err);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
+ self.read_num_bytes(num_bytes);
|
|
|
}
|
|
|
- };
|
|
|
- result
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// Reads the specified number of bytes as a new byte array.
|
|
|
- fn read_byte_array(ref self: Reader, num_bytes: usize) -> Result<ByteArray, Error> {
|
|
|
+ fn read_byte_array(ref self: Reader, num_bytes: usize) -> ByteArray {
|
|
|
let mut array: Array<bytes31> = array![];
|
|
|
- let mut num_last_bytes = Option::None;
|
|
|
+ let mut num_last_bytes = 0;
|
|
|
let mut num_remaining_bytes = num_bytes;
|
|
|
loop {
|
|
|
- let r = self.read_bytes_iteration(num_remaining_bytes, ref array);
|
|
|
- match r {
|
|
|
- Result::Ok((
|
|
|
- num_read, eof
|
|
|
- )) => {
|
|
|
- num_remaining_bytes -= num_read;
|
|
|
- if eof {
|
|
|
- num_last_bytes = Option::Some(Result::Ok(num_read));
|
|
|
- break;
|
|
|
- }
|
|
|
- },
|
|
|
- Result::Err(err) => {
|
|
|
- num_last_bytes = Option::Some(Result::Err(err));
|
|
|
- break;
|
|
|
- }
|
|
|
+ let (num_read, eof) = self.read_bytes_iteration(num_remaining_bytes, ref array);
|
|
|
+ num_remaining_bytes -= num_read;
|
|
|
+ if eof {
|
|
|
+ num_last_bytes = num_read;
|
|
|
+ break;
|
|
|
}
|
|
|
};
|
|
|
- // `num_last_bytes` is always set to Some before break.
|
|
|
- let num_last_bytes = num_last_bytes.unwrap()?;
|
|
|
// num_last_bytes < 31
|
|
|
let num_last_bytes = num_last_bytes.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
- let array = ByteArrayImpl::new(array, num_last_bytes);
|
|
|
- Result::Ok(array)
|
|
|
+ ByteArrayImpl::new(array, num_last_bytes)
|
|
|
}
|
|
|
|
|
|
/// Returns number of remaining bytes to read.
|
|
|
@@ -179,7 +144,7 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
|
|
|
/// Replenishes `self.current` and `self.num_current_bytes`.
|
|
|
/// This should only be called when all bytes from `self.current` has been read.
|
|
|
/// Returns `EOF` error if no more data is available.
|
|
|
- fn fetch_next(ref self: Reader) -> Result<(), Error> {
|
|
|
+ fn fetch_next(ref self: Reader) {
|
|
|
match self.next {
|
|
|
Option::Some(next) => {
|
|
|
self.next = Option::None;
|
|
|
@@ -187,7 +152,10 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
|
|
|
self.num_current_bytes = 16;
|
|
|
},
|
|
|
Option::None => {
|
|
|
- let (value, bytes) = self.array.pop_front().ok_or(Error::UnexpectedEndOfInput)?;
|
|
|
+ let (value, bytes) = self
|
|
|
+ .array
|
|
|
+ .pop_front()
|
|
|
+ .expect(Error::UnexpectedEndOfInput.into());
|
|
|
let value: u256 = value.into();
|
|
|
if bytes > 16 {
|
|
|
self.current = value.high;
|
|
|
@@ -199,33 +167,31 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
- Result::Ok(())
|
|
|
}
|
|
|
|
|
|
// Moved out from `read_bytes` because we cannot use `return` or `?` within a loop.
|
|
|
fn read_bytes_iteration(
|
|
|
ref self: Reader, num_bytes: usize, ref array: Array<bytes31>
|
|
|
- ) -> Result<(usize, bool), Error> {
|
|
|
+ ) -> (usize, bool) {
|
|
|
if num_bytes >= 31 {
|
|
|
- let high = self.read_num_bytes(15)?;
|
|
|
- let low = self.read_num_bytes(16)?;
|
|
|
+ let high = self.read_num_bytes(15);
|
|
|
+ let low = self.read_num_bytes(16);
|
|
|
let value: felt252 = u256 { high, low }.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
array.append(value.try_into().expect(UNEXPECTED_OVERFLOW));
|
|
|
- Result::Ok((31, false))
|
|
|
+ (31, false)
|
|
|
} else if num_bytes > 16 {
|
|
|
// num_bytes < 31
|
|
|
- let high = self
|
|
|
- .read_num_bytes((num_bytes - 16).try_into().expect(UNEXPECTED_OVERFLOW))?;
|
|
|
- let low = self.read_num_bytes(16)?;
|
|
|
+ let high = self.read_num_bytes((num_bytes - 16).try_into().expect(UNEXPECTED_OVERFLOW));
|
|
|
+ let low = self.read_num_bytes(16);
|
|
|
let value: felt252 = u256 { high, low }.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
array.append(value.try_into().expect(UNEXPECTED_OVERFLOW));
|
|
|
- Result::Ok((num_bytes, true))
|
|
|
+ (num_bytes, true)
|
|
|
} else {
|
|
|
// bytes < 16
|
|
|
- let low = self.read_num_bytes(num_bytes.try_into().expect(UNEXPECTED_OVERFLOW))?;
|
|
|
+ let low = self.read_num_bytes(num_bytes.try_into().expect(UNEXPECTED_OVERFLOW));
|
|
|
let value: felt252 = low.try_into().expect(UNEXPECTED_OVERFLOW);
|
|
|
array.append(value.try_into().expect(UNEXPECTED_OVERFLOW));
|
|
|
- Result::Ok((num_bytes, true))
|
|
|
+ (num_bytes, true)
|
|
|
}
|
|
|
}
|
|
|
}
|