@@ -5,8 +5,17 @@ use core::integer::u128_byte_reverse;
5
5
use core :: fmt :: {Debug , Formatter };
6
6
use pyth :: util :: {UNEXPECTED_OVERFLOW , UNEXPECTED_ZERO , one_shift_left_bytes_u128 };
7
7
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
+ }
10
19
}
11
20
12
21
/// A byte array with storage format similar to `core::ByteArray`, but
@@ -95,7 +104,7 @@ pub impl ReaderImpl of ReaderTrait {
95
104
}
96
105
97
106
/// 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 > {
99
108
assert! (num_bytes <= 16 , " Reader::read_num_bytes: num_bytes is too large" );
100
109
if num_bytes <= self . num_current_bytes {
101
110
let x = self . read_from_current (num_bytes );
@@ -113,40 +122,40 @@ pub impl ReaderImpl of ReaderTrait {
113
122
Result :: Ok (value )
114
123
}
115
124
116
- fn read_u256 (ref self : Reader ) -> Result <u256 , felt252 > {
125
+ fn read_u256 (ref self : Reader ) -> Result <u256 , Error > {
117
126
let high = self . read_num_bytes (16 )? ;
118
127
let low = self . read_num_bytes (16 )? ;
119
128
let value = u256 { high , low };
120
129
Result :: Ok (value )
121
130
}
122
- fn read_u160 (ref self : Reader ) -> Result <u256 , felt252 > {
131
+ fn read_u160 (ref self : Reader ) -> Result <u256 , Error > {
123
132
let high = self . read_num_bytes (4 )? ;
124
133
let low = self . read_num_bytes (16 )? ;
125
134
let value = u256 { high , low };
126
135
Result :: Ok (value )
127
136
}
128
- fn read_u128 (ref self : Reader ) -> Result <u128 , felt252 > {
137
+ fn read_u128 (ref self : Reader ) -> Result <u128 , Error > {
129
138
self . read_num_bytes (16 )
130
139
}
131
- fn read_u64 (ref self : Reader ) -> Result <u64 , felt252 > {
140
+ fn read_u64 (ref self : Reader ) -> Result <u64 , Error > {
132
141
let value = self . read_num_bytes (8 )? . try_into (). expect (UNEXPECTED_OVERFLOW );
133
142
Result :: Ok (value )
134
143
}
135
- fn read_u32 (ref self : Reader ) -> Result <u32 , felt252 > {
144
+ fn read_u32 (ref self : Reader ) -> Result <u32 , Error > {
136
145
let value = self . read_num_bytes (4 )? . try_into (). expect (UNEXPECTED_OVERFLOW );
137
146
Result :: Ok (value )
138
147
}
139
- fn read_u16 (ref self : Reader ) -> Result <u16 , felt252 > {
148
+ fn read_u16 (ref self : Reader ) -> Result <u16 , Error > {
140
149
let value = self . read_num_bytes (2 )? . try_into (). expect (UNEXPECTED_OVERFLOW );
141
150
Result :: Ok (value )
142
151
}
143
- fn read_u8 (ref self : Reader ) -> Result <u8 , felt252 > {
152
+ fn read_u8 (ref self : Reader ) -> Result <u8 , Error > {
144
153
let value = self . read_num_bytes (1 )? . try_into (). expect (UNEXPECTED_OVERFLOW );
145
154
Result :: Ok (value )
146
155
}
147
156
148
157
// 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 > {
150
159
let mut result = Result :: Ok (());
151
160
while num_bytes > 0 {
152
161
if num_bytes > 16 {
@@ -173,7 +182,7 @@ pub impl ReaderImpl of ReaderTrait {
173
182
}
174
183
175
184
/// 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 > {
177
186
let mut array : Array <bytes31 > = array! [];
178
187
let mut num_last_bytes = Option :: None ;
179
188
let mut num_remaining_bytes = num_bytes ;
@@ -232,15 +241,15 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
232
241
/// Replenishes `self.current` and `self.num_current_bytes`.
233
242
/// This should only be called when all bytes from `self.current` has been read.
234
243
/// 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 > {
236
245
match self . next {
237
246
Option :: Some (next ) => {
238
247
self . next = Option :: None ;
239
248
self . current = next ;
240
249
self . num_current_bytes = 16 ;
241
250
},
242
251
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 )? ;
244
253
let value : u256 = value . into ();
245
254
if bytes > 16 {
246
255
self . current = value . high;
@@ -258,7 +267,7 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
258
267
// Moved out from `read_bytes` because we cannot use `return` or `?` within a loop.
259
268
fn read_bytes_iteration (
260
269
ref self : Reader , num_bytes : usize , ref array : Array <bytes31 >
261
- ) -> Result <(usize , bool ), felt252 > {
270
+ ) -> Result <(usize , bool ), Error > {
262
271
if num_bytes >= 31 {
263
272
let high = self . read_num_bytes (15 )? ;
264
273
let low = self . read_num_bytes (16 )? ;
0 commit comments