Skip to content

Commit 8b66d0f

Browse files
committed
refactor(target_chains/starknet): use enum errors
1 parent 0a219fb commit 8b66d0f

File tree

6 files changed

+192
-93
lines changed

6 files changed

+192
-93
lines changed

target_chains/starknet/contracts/src/hash.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub impl HasherImpl of HasherTrait {
5555

5656
/// Reads all remaining data from the reader and pushes it to
5757
/// the hashing buffer.
58-
fn push_reader(ref self: Hasher, ref reader: Reader) -> Result<(), felt252> {
58+
fn push_reader(ref self: Hasher, ref reader: Reader) -> Result<(), pyth::reader::Error> {
5959
let mut result = Result::Ok(());
6060
while reader.len() > 0 {
6161
let mut chunk_len = 8 - self.num_last_bytes;

target_chains/starknet/contracts/src/lib.cairo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ pub mod pyth;
22
pub mod wormhole;
33
pub mod reader;
44
pub mod hash;
5-
mod util;
5+
pub mod util;

target_chains/starknet/contracts/src/reader.cairo

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,17 @@ use core::integer::u128_byte_reverse;
55
use core::fmt::{Debug, Formatter};
66
use pyth::util::{UNEXPECTED_OVERFLOW, UNEXPECTED_ZERO, one_shift_left_bytes_u128};
77

8-
pub mod errors {
9-
pub const EOF: felt252 = 'unexpected end of input';
8+
#[derive(Copy, Drop, Debug, Serde, PartialEq)]
9+
pub enum Error {
10+
UnexpectedEndOfInput,
11+
}
12+
13+
impl ErrorIntoFelt252 of Into<Error, felt252> {
14+
fn into(self: Error) -> felt252 {
15+
match self {
16+
Error::UnexpectedEndOfInput => 'unexpected end of input',
17+
}
18+
}
1019
}
1120

1221
/// A byte array with storage format similar to `core::ByteArray`, but
@@ -95,7 +104,7 @@ pub impl ReaderImpl of ReaderTrait {
95104
}
96105

97106
/// Reads the specified number of bytes (up to 16) as a big endian unsigned integer.
98-
fn read_num_bytes(ref self: Reader, num_bytes: u8) -> Result<u128, felt252> {
107+
fn read_num_bytes(ref self: Reader, num_bytes: u8) -> Result<u128, Error> {
99108
assert!(num_bytes <= 16, "Reader::read_num_bytes: num_bytes is too large");
100109
if num_bytes <= self.num_current_bytes {
101110
let x = self.read_from_current(num_bytes);
@@ -113,40 +122,40 @@ pub impl ReaderImpl of ReaderTrait {
113122
Result::Ok(value)
114123
}
115124

116-
fn read_u256(ref self: Reader) -> Result<u256, felt252> {
125+
fn read_u256(ref self: Reader) -> Result<u256, Error> {
117126
let high = self.read_num_bytes(16)?;
118127
let low = self.read_num_bytes(16)?;
119128
let value = u256 { high, low };
120129
Result::Ok(value)
121130
}
122-
fn read_u160(ref self: Reader) -> Result<u256, felt252> {
131+
fn read_u160(ref self: Reader) -> Result<u256, Error> {
123132
let high = self.read_num_bytes(4)?;
124133
let low = self.read_num_bytes(16)?;
125134
let value = u256 { high, low };
126135
Result::Ok(value)
127136
}
128-
fn read_u128(ref self: Reader) -> Result<u128, felt252> {
137+
fn read_u128(ref self: Reader) -> Result<u128, Error> {
129138
self.read_num_bytes(16)
130139
}
131-
fn read_u64(ref self: Reader) -> Result<u64, felt252> {
140+
fn read_u64(ref self: Reader) -> Result<u64, Error> {
132141
let value = self.read_num_bytes(8)?.try_into().expect(UNEXPECTED_OVERFLOW);
133142
Result::Ok(value)
134143
}
135-
fn read_u32(ref self: Reader) -> Result<u32, felt252> {
144+
fn read_u32(ref self: Reader) -> Result<u32, Error> {
136145
let value = self.read_num_bytes(4)?.try_into().expect(UNEXPECTED_OVERFLOW);
137146
Result::Ok(value)
138147
}
139-
fn read_u16(ref self: Reader) -> Result<u16, felt252> {
148+
fn read_u16(ref self: Reader) -> Result<u16, Error> {
140149
let value = self.read_num_bytes(2)?.try_into().expect(UNEXPECTED_OVERFLOW);
141150
Result::Ok(value)
142151
}
143-
fn read_u8(ref self: Reader) -> Result<u8, felt252> {
152+
fn read_u8(ref self: Reader) -> Result<u8, Error> {
144153
let value = self.read_num_bytes(1)?.try_into().expect(UNEXPECTED_OVERFLOW);
145154
Result::Ok(value)
146155
}
147156

148157
// TODO: skip without calculating values
149-
fn skip(ref self: Reader, mut num_bytes: u8) -> Result<(), felt252> {
158+
fn skip(ref self: Reader, mut num_bytes: u8) -> Result<(), Error> {
150159
let mut result = Result::Ok(());
151160
while num_bytes > 0 {
152161
if num_bytes > 16 {
@@ -173,7 +182,7 @@ pub impl ReaderImpl of ReaderTrait {
173182
}
174183

175184
/// Reads the specified number of bytes as a new byte array.
176-
fn read_byte_array(ref self: Reader, num_bytes: usize) -> Result<ByteArray, felt252> {
185+
fn read_byte_array(ref self: Reader, num_bytes: usize) -> Result<ByteArray, Error> {
177186
let mut array: Array<bytes31> = array![];
178187
let mut num_last_bytes = Option::None;
179188
let mut num_remaining_bytes = num_bytes;
@@ -232,15 +241,15 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
232241
/// Replenishes `self.current` and `self.num_current_bytes`.
233242
/// This should only be called when all bytes from `self.current` has been read.
234243
/// Returns `EOF` error if no more data is available.
235-
fn fetch_next(ref self: Reader) -> Result<(), felt252> {
244+
fn fetch_next(ref self: Reader) -> Result<(), Error> {
236245
match self.next {
237246
Option::Some(next) => {
238247
self.next = Option::None;
239248
self.current = next;
240249
self.num_current_bytes = 16;
241250
},
242251
Option::None => {
243-
let (value, bytes) = self.array.pop_front().ok_or(errors::EOF)?;
252+
let (value, bytes) = self.array.pop_front().ok_or(Error::UnexpectedEndOfInput)?;
244253
let value: u256 = value.into();
245254
if bytes > 16 {
246255
self.current = value.high;
@@ -258,7 +267,7 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
258267
// Moved out from `read_bytes` because we cannot use `return` or `?` within a loop.
259268
fn read_bytes_iteration(
260269
ref self: Reader, num_bytes: usize, ref array: Array<bytes31>
261-
) -> Result<(usize, bool), felt252> {
270+
) -> Result<(usize, bool), Error> {
262271
if num_bytes >= 31 {
263272
let high = self.read_num_bytes(15)?;
264273
let low = self.read_num_bytes(16)?;

target_chains/starknet/contracts/src/util.cairo

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,11 @@ pub fn u64_byte_reverse(value: u64) -> u64 {
5454
let reversed = u128_byte_reverse(value.into()) / ONE_SHIFT_64.try_into().expect('not zero');
5555
reversed.try_into().unwrap()
5656
}
57+
58+
/// If `self` is an error, panics with a `felt252` value
59+
/// corresponding to the error. Otherwise, returns the success value.
60+
/// This differs from `Result::unwrap` which always panics with
61+
/// the same message and doesn't include information about the error.
62+
pub trait UnwrapWithFelt252<T, E> {
63+
fn unwrap_with_felt252(self: Result<T, E>) -> T;
64+
}

0 commit comments

Comments
 (0)