1+ use core:: panic;
12use std:: { fs:: File , io:: { Error , ErrorKind , Read as _, Seek as _, SeekFrom , Write as _} } ;
23
34pub const EMPTY : [ u8 ; 1 ] = [ 0 ; 1 ] ;
45pub const OP_LEN : u8 = 4 ;
56
67pub fn write_empty_byte ( file : & mut File ) {
7- file. write ( & EMPTY ) . unwrap ( ) ;
8+ let res = file. write ( & EMPTY ) ;
9+ if let Err ( e) = res {
10+ panic ! ( "Failed to write empty byte: {}" , e) ;
11+ }
12+ if res. unwrap ( ) != EMPTY . len ( ) {
13+ panic ! ( "Failed to write empty byte: {}" , "Write length mismatch." ) ;
14+ }
815}
916
1017pub fn cut ( file : & mut File ) {
1118
12- let pos = file. seek ( SeekFrom :: Current ( 0 ) ) . unwrap ( ) ;
19+ let pos = file. seek ( SeekFrom :: Current ( 0 ) ) ;
20+
21+ if let Err ( e) = pos {
22+ panic ! ( "Failed to cut file: {}" , e) ;
23+ }
24+
25+ let pos = pos. unwrap ( ) ;
26+
27+ let res = file. set_len ( pos) ;
28+
29+ if let Err ( e) = res {
30+ panic ! ( "Failed to cut file: {}" , e) ;
31+ }
1332
14- file. set_len ( pos) . unwrap ( ) ;
1533 write_empty_byte ( file) ;
1634}
1735
1836pub fn truncate ( file : & mut File ) {
19- file. set_len ( 0 ) . unwrap ( ) ;
37+ let res = file. set_len ( 0 ) ;
38+
39+ if let Err ( e) = res {
40+ panic ! ( "Failed to truncate file: {}" , e) ;
41+ }
42+
2043 write_empty_byte ( file) ;
2144 jump_stream_start ( file) ;
2245}
2346
2447pub fn jump_stream_start ( file : & mut File ) {
25- file. seek ( SeekFrom :: Start ( 0 ) ) . unwrap ( ) ;
48+ let res = file. seek ( SeekFrom :: Start ( 0 ) ) ;
49+
50+ if let Err ( e) = res {
51+ panic ! ( "Failed to jump stream start: {}" , e) ;
52+ }
2653}
2754
2855pub fn jump_stream_end ( file : & mut File ) {
29- file. seek ( SeekFrom :: End ( -1 ) ) . unwrap ( ) ;
56+ let res = file. seek ( SeekFrom :: End ( -1 ) ) ;
57+
58+ if let Err ( e) = res {
59+ panic ! ( "Failed to jump stream end: {}" , e) ;
60+ }
3061}
3162
32- pub fn catch_stream_read ( file : & mut File , read : usize , predict : usize ) -> Result < ( ) , Error > {
63+ pub fn catch_stream_read ( file : & mut File , read : usize , predict : usize , fix_fn : fn ( file : & mut File ) ) -> Result < ( ) , Error > {
3364 if read != predict {
34- jump_stream_start ( file) ;
65+ fix_fn ( file) ;
3566 return Err (
3667 Error :: new (
3768 ErrorKind :: UnexpectedEof ,
@@ -60,7 +91,11 @@ pub fn write(file: &mut File, data: Vec<u8>) -> Result<(), Error> {
6091 obj. extend_from_slice ( & data) ;
6192 obj. extend_from_slice ( & op) ;
6293
63- file. write ( & obj) . unwrap ( ) ;
94+ let res = file. write ( & obj) ;
95+
96+ if let Err ( e) = res {
97+ panic ! ( "Failed to write data: {}" , e) ;
98+ }
6499
65100 Ok ( ( ) )
66101}
@@ -69,28 +104,62 @@ pub fn read(file: &mut File) -> Result<Vec<u8>, Error> {
69104
70105 let mut len_buf_left: [ u8 ; OP_LEN as usize ] = [ 0 ; OP_LEN as usize ] ;
71106 let res = file. read ( & mut len_buf_left) ;
107+
108+ if let Err ( e) = res {
109+ panic ! ( "Failed to read data: {}" , e) ;
110+ }
111+
112+ let res = res. unwrap ( ) ;
113+
72114 catch_stream_read (
73115 file,
74- res?,
75- OP_LEN as usize
116+ res,
117+ OP_LEN as usize ,
118+ jump_stream_end
76119 ) ?;
120+
77121 let len_left = u32:: from_be_bytes ( len_buf_left) as usize ;
78122
79123 let mut data = vec ! [ 0 ; len_left] ;
80124 let res = file. read ( & mut data) ;
81- catch_stream_read (
125+
126+ if let Err ( e) = res {
127+ panic ! ( "Failed to read data: {}" , e) ;
128+ }
129+
130+ let res = res. unwrap ( ) ;
131+
132+ let catch = catch_stream_read (
82133 file,
83- res?,
84- len_left
85- ) ?;
134+ res,
135+ len_left,
136+ jump_stream_start
137+ ) ;
138+
139+ if let Err ( e) = catch {
140+ panic ! ( "Failed to read data: {}" , e) ;
141+ }
86142
87143 let mut len_buf_right: [ u8 ; OP_LEN as usize ] = [ 0 ; OP_LEN as usize ] ;
88144 let res = file. read ( & mut len_buf_right) ;
89- catch_stream_read (
145+
146+ if let Err ( e) = res {
147+ panic ! ( "Failed to read data: {}" , e) ;
148+ }
149+
150+ let res = res. unwrap ( ) ;
151+
152+ let catch = catch_stream_read (
90153 file,
91- res?,
92- OP_LEN as usize
93- ) ?;
154+ res,
155+ OP_LEN as usize ,
156+ jump_stream_start
157+ ) ;
158+
159+ if let Err ( e) = catch {
160+ panic ! ( "Failed to read data: {}" , e) ;
161+ }
162+
94163 let len_right = u32:: from_be_bytes ( len_buf_right) as usize ;
95164
96165 if len_left != len_right {
@@ -104,35 +173,79 @@ pub fn seek_forward(file: &mut File) -> Result<(), Error> {
104173 let mut len_buf: [ u8 ; OP_LEN as usize ] = [ 0 ; OP_LEN as usize ] ;
105174
106175 let res = file. read ( & mut len_buf) ;
176+
177+ if let Err ( e) = res {
178+ panic ! ( "Failed to read data: {}" , e) ;
179+ }
180+
107181 catch_stream_read (
108182 file,
109183 res?,
110- OP_LEN as usize
184+ OP_LEN as usize ,
185+ jump_stream_end
111186 ) ?;
187+
112188 let len = u32:: from_be_bytes ( len_buf) as i64 ;
113189
114- file. seek ( SeekFrom :: Current ( len) ) . unwrap ( ) ;
190+ let catch = file. seek ( SeekFrom :: Current ( len) ) ;
115191
116- file. seek ( SeekFrom :: Current ( OP_LEN as i64 ) ) . unwrap ( ) ;
192+ if let Err ( e) = catch {
193+ panic ! ( "Failed to seek forward: {}" , e) ;
194+ }
195+
196+ let catch = file. seek ( SeekFrom :: Current ( OP_LEN as i64 ) ) ;
197+
198+ if let Err ( e) = catch {
199+ panic ! ( "Failed to seek forward: {}" , e) ;
200+ }
117201
118202 Ok ( ( ) )
119203}
120204
121205pub fn seek_backward ( file : & mut File ) -> Result < ( ) , Error > {
122206 let mut len_buf: [ u8 ; OP_LEN as usize ] = [ 0 ; OP_LEN as usize ] ;
123207
124- file. seek ( SeekFrom :: Current ( -( OP_LEN as i64 ) ) ) . unwrap ( ) ;
208+ let res = file. seek ( SeekFrom :: Current ( -( OP_LEN as i64 ) ) ) ;
209+
210+ if let Err ( e) = res {
211+ if e. kind ( ) == ErrorKind :: InvalidInput {
212+ return Err (
213+ Error :: new (
214+ ErrorKind :: UnexpectedEof ,
215+ "Reached stream start."
216+ )
217+ )
218+ }
219+ panic ! ( "Failed to seek backward: {}" , e) ;
220+ }
125221
126222 let res = file. read ( & mut len_buf) ;
127- catch_stream_read (
223+ let catch = catch_stream_read (
128224 file,
129225 res?,
130- OP_LEN as usize
131- ) ?;
226+ OP_LEN as usize ,
227+ jump_stream_start
228+ ) ;
229+
230+ if let Err ( e) = catch {
231+ panic ! ( "Failed to seek backward: {}" , e) ;
232+ }
132233
133234 let len = u32:: from_be_bytes ( len_buf) as i64 ;
134235
135- file. seek ( SeekFrom :: Current ( -len -2 * OP_LEN as i64 ) ) ?;
236+ let res = file. seek ( SeekFrom :: Current ( -len -2 * OP_LEN as i64 ) ) ;
237+
238+ if let Err ( e) = res {
239+ if e. kind ( ) == ErrorKind :: InvalidInput {
240+ return Err (
241+ Error :: new (
242+ ErrorKind :: UnexpectedEof ,
243+ "Reached stream start."
244+ )
245+ )
246+ }
247+ panic ! ( "Failed to seek backward: {}" , e) ;
248+ }
136249
137250 Ok ( ( ) )
138251}
@@ -154,14 +267,25 @@ pub fn seek_backward_n(file: &mut File, n: u64) -> Result<(), Error> {
154267pub fn inner_len ( file : & mut File ) -> Result < u32 , Error > {
155268 let mut len_buf: [ u8 ; OP_LEN as usize ] = [ 0 ; OP_LEN as usize ] ;
156269 let res = file. read ( & mut len_buf) ;
270+
271+ if let Err ( e) = res {
272+ panic ! ( "Failed to read data: {}" , e) ;
273+ }
274+
157275 catch_stream_read (
158276 file,
159277 res?,
160- OP_LEN as usize
278+ OP_LEN as usize ,
279+ jump_stream_end
161280 ) ?;
281+
162282 let len = u32:: from_be_bytes ( len_buf) as u32 ;
163283
164- file. seek ( SeekFrom :: Current ( -( OP_LEN as i64 ) ) ) ?;
284+ let res = file. seek ( SeekFrom :: Current ( -( OP_LEN as i64 ) ) ) ;
285+
286+ if let Err ( e) = res {
287+ panic ! ( "Failed to seek backward: {}" , e) ;
288+ }
165289
166290 Ok ( len)
167291}
0 commit comments