@@ -70,7 +70,8 @@ impl FromStr for Timestamp {
70
70
type Err = LoftyError ;
71
71
72
72
fn from_str ( s : & str ) -> Result < Self > {
73
- Timestamp :: parse ( & mut s. as_bytes ( ) , ParsingMode :: BestAttempt )
73
+ Timestamp :: parse ( & mut s. as_bytes ( ) , ParsingMode :: BestAttempt ) ?
74
+ . ok_or_else ( || LoftyError :: new ( ErrorKind :: BadTimestamp ( "Timestamp frame is empty" ) ) )
74
75
}
75
76
}
76
77
@@ -86,7 +87,7 @@ impl Timestamp {
86
87
///
87
88
/// * Failure to read from `reader`
88
89
/// * The timestamp is invalid
89
- pub fn parse < R > ( reader : & mut R , parse_mode : ParsingMode ) -> Result < Self >
90
+ pub fn parse < R > ( reader : & mut R , parse_mode : ParsingMode ) -> Result < Option < Self > >
90
91
where
91
92
R : Read ,
92
93
{
@@ -109,6 +110,14 @@ impl Timestamp {
109
110
. take ( Self :: MAX_LENGTH as u64 )
110
111
. read_to_end ( & mut content) ?;
111
112
113
+ if content. is_empty ( ) {
114
+ if parse_mode == ParsingMode :: Strict {
115
+ err ! ( BadTimestamp ( "Timestamp frame is empty" ) )
116
+ }
117
+
118
+ return Ok ( None ) ;
119
+ }
120
+
112
121
let reader = & mut & content[ ..] ;
113
122
114
123
// We need to very that the year is exactly 4 bytes long. This doesn't matter for other segments.
@@ -131,7 +140,7 @@ impl Timestamp {
131
140
break ;
132
141
}
133
142
134
- Ok ( timestamp)
143
+ Ok ( Some ( timestamp) )
135
144
}
136
145
137
146
fn segment < const SIZE : usize > (
@@ -237,7 +246,7 @@ mod tests {
237
246
let parsed_timestamp =
238
247
Timestamp :: parse ( & mut content. as_bytes ( ) , ParsingMode :: Strict ) . unwrap ( ) ;
239
248
240
- assert_eq ! ( parsed_timestamp, expected( ) ) ;
249
+ assert_eq ! ( parsed_timestamp, Some ( expected( ) ) ) ;
241
250
}
242
251
243
252
#[ test]
@@ -248,7 +257,7 @@ mod tests {
248
257
let parsed_timestamp =
249
258
Timestamp :: parse ( & mut content. as_bytes ( ) , ParsingMode :: BestAttempt ) . unwrap ( ) ;
250
259
251
- assert_eq ! ( parsed_timestamp, expected( ) ) ;
260
+ assert_eq ! ( parsed_timestamp, Some ( expected( ) ) ) ;
252
261
}
253
262
254
263
#[ test]
@@ -259,7 +268,7 @@ mod tests {
259
268
let parsed_timestamp =
260
269
Timestamp :: parse ( & mut content. as_bytes ( ) , ParsingMode :: BestAttempt ) . unwrap ( ) ;
261
270
262
- assert_eq ! ( parsed_timestamp, expected( ) ) ;
271
+ assert_eq ! ( parsed_timestamp, Some ( expected( ) ) ) ;
263
272
}
264
273
265
274
#[ test]
@@ -348,7 +357,17 @@ mod tests {
348
357
349
358
for ( data, expected) in partial_timestamps {
350
359
let parsed_timestamp = Timestamp :: parse ( & mut & data[ ..] , ParsingMode :: Strict ) . unwrap ( ) ;
351
- assert_eq ! ( parsed_timestamp, expected) ;
360
+ assert_eq ! ( parsed_timestamp, Some ( expected) ) ;
352
361
}
353
362
}
363
+
364
+ #[ test]
365
+ fn empty_timestamp ( ) {
366
+ let empty_timestamp =
367
+ Timestamp :: parse ( & mut "" . as_bytes ( ) , ParsingMode :: BestAttempt ) . unwrap ( ) ;
368
+ assert ! ( empty_timestamp. is_none( ) ) ;
369
+
370
+ let empty_timestamp_strict = Timestamp :: parse ( & mut "" . as_bytes ( ) , ParsingMode :: Strict ) ;
371
+ assert ! ( empty_timestamp_strict. is_err( ) ) ;
372
+ }
354
373
}
0 commit comments