@@ -99,7 +99,10 @@ pub struct Data<'orig> {
99
99
100
100
impl < ' orig > Data < ' orig > {
101
101
/// Create a new data container from a slice of bytes
102
- pub fn new ( data : & ' orig [ u8 ] ) -> Self {
102
+ pub fn new < T > ( data : & ' orig T ) -> Self
103
+ where
104
+ T : AsRef < [ u8 ] > + ?Sized ,
105
+ {
103
106
Data {
104
107
original : data. as_ref ( ) ,
105
108
parts : vec ! [ ] ,
@@ -142,7 +145,10 @@ impl<'orig> Data<'orig> {
142
145
/// this method will return an error.
143
146
/// It will also return an error if the beginning of the range comes before its end,
144
147
/// or if the range is outside that of the original data.
145
- pub fn replace_range ( & mut self , range : Range < usize > , data : & ' orig [ u8 ] ) -> Result < ( ) , Error > {
148
+ pub fn replace_range < T > ( & mut self , range : Range < usize > , data : & ' orig T ) -> Result < ( ) , Error >
149
+ where
150
+ T : AsRef < [ u8 ] > + ?Sized ,
151
+ {
146
152
if range. start > range. end {
147
153
return Err ( Error :: InvalidRange ( range) ) ;
148
154
}
@@ -198,63 +204,63 @@ mod tests {
198
204
199
205
#[ test]
200
206
fn insert_at_beginning ( ) {
201
- let mut d = Data :: new ( b "foo bar baz") ;
202
- d. replace_range ( 0 ..0 , b "oh no ") . unwrap ( ) ;
207
+ let mut d = Data :: new ( "foo bar baz" ) ;
208
+ d. replace_range ( 0 ..0 , "oh no " ) . unwrap ( ) ;
203
209
assert_eq ! ( "oh no foo bar baz" , str ( & d. to_vec( ) ) ) ;
204
210
}
205
211
206
212
#[ test]
207
213
fn insert_at_end ( ) {
208
- let mut d = Data :: new ( b "foo bar baz") ;
209
- d. replace_range ( 11 ..11 , b " oh no") . unwrap ( ) ;
214
+ let mut d = Data :: new ( "foo bar baz" ) ;
215
+ d. replace_range ( 11 ..11 , " oh no" ) . unwrap ( ) ;
210
216
assert_eq ! ( "foo bar baz oh no" , str ( & d. to_vec( ) ) ) ;
211
217
}
212
218
213
219
#[ test]
214
220
fn replace_some_stuff ( ) {
215
- let mut d = Data :: new ( b "foo bar baz") ;
216
- d. replace_range ( 4 ..7 , b "lol") . unwrap ( ) ;
221
+ let mut d = Data :: new ( "foo bar baz" ) ;
222
+ d. replace_range ( 4 ..7 , "lol" ) . unwrap ( ) ;
217
223
assert_eq ! ( "foo lol baz" , str ( & d. to_vec( ) ) ) ;
218
224
}
219
225
220
226
#[ test]
221
227
fn replace_a_single_char ( ) {
222
- let mut d = Data :: new ( b "let y = true;") ;
223
- d. replace_range ( 4 ..5 , b "mut y") . unwrap ( ) ;
228
+ let mut d = Data :: new ( "let y = true;" ) ;
229
+ d. replace_range ( 4 ..5 , "mut y" ) . unwrap ( ) ;
224
230
assert_eq ! ( "let mut y = true;" , str ( & d. to_vec( ) ) ) ;
225
231
}
226
232
227
233
#[ test]
228
234
fn replace_multiple_lines ( ) {
229
- let mut d = Data :: new ( b "lorem\n ipsum\n dolor") ;
235
+ let mut d = Data :: new ( "lorem\n ipsum\n dolor" ) ;
230
236
231
- d. replace_range ( 6 ..11 , b "lol") . unwrap ( ) ;
237
+ d. replace_range ( 6 ..11 , "lol" ) . unwrap ( ) ;
232
238
assert_eq ! ( "lorem\n lol\n dolor" , str ( & d. to_vec( ) ) ) ;
233
239
234
- d. replace_range ( 12 ..17 , b "lol") . unwrap ( ) ;
240
+ d. replace_range ( 12 ..17 , "lol" ) . unwrap ( ) ;
235
241
assert_eq ! ( "lorem\n lol\n lol" , str ( & d. to_vec( ) ) ) ;
236
242
}
237
243
238
244
#[ test]
239
245
fn replace_multiple_lines_with_insert_only ( ) {
240
- let mut d = Data :: new ( b "foo!") ;
246
+ let mut d = Data :: new ( "foo!" ) ;
241
247
242
- d. replace_range ( 3 ..3 , b "bar") . unwrap ( ) ;
248
+ d. replace_range ( 3 ..3 , "bar" ) . unwrap ( ) ;
243
249
assert_eq ! ( "foobar!" , str ( & d. to_vec( ) ) ) ;
244
250
245
- d. replace_range ( 0 ..3 , b "baz") . unwrap ( ) ;
251
+ d. replace_range ( 0 ..3 , "baz" ) . unwrap ( ) ;
246
252
assert_eq ! ( "bazbar!" , str ( & d. to_vec( ) ) ) ;
247
253
248
- d. replace_range ( 3 ..4 , b "?") . unwrap ( ) ;
254
+ d. replace_range ( 3 ..4 , "?" ) . unwrap ( ) ;
249
255
assert_eq ! ( "bazbar?" , str ( & d. to_vec( ) ) ) ;
250
256
}
251
257
252
258
#[ test]
253
259
fn replace_invalid_range ( ) {
254
- let mut d = Data :: new ( b "foo!") ;
260
+ let mut d = Data :: new ( "foo!" ) ;
255
261
256
- assert ! ( d. replace_range( 2 ..1 , b "bar") . is_err( ) ) ;
257
- assert ! ( d. replace_range( 0 ..3 , b "bar") . is_ok( ) ) ;
262
+ assert ! ( d. replace_range( 2 ..1 , "bar" ) . is_err( ) ) ;
263
+ assert ! ( d. replace_range( 0 ..3 , "bar" ) . is_ok( ) ) ;
258
264
}
259
265
260
266
#[ test]
@@ -265,13 +271,13 @@ mod tests {
265
271
266
272
#[ test]
267
273
fn replace_same_range_diff_data ( ) {
268
- let mut d = Data :: new ( b "foo bar baz") ;
274
+ let mut d = Data :: new ( "foo bar baz" ) ;
269
275
270
- d. replace_range ( 4 ..7 , b "lol") . unwrap ( ) ;
276
+ d. replace_range ( 4 ..7 , "lol" ) . unwrap ( ) ;
271
277
assert_eq ! ( "foo lol baz" , str ( & d. to_vec( ) ) ) ;
272
278
273
279
assert ! ( matches!(
274
- d. replace_range( 4 ..7 , b "lol2") . unwrap_err( ) ,
280
+ d. replace_range( 4 ..7 , "lol2" ) . unwrap_err( ) ,
275
281
Error :: AlreadyReplaced {
276
282
is_identical: false ,
277
283
..
@@ -281,13 +287,13 @@ mod tests {
281
287
282
288
#[ test]
283
289
fn replace_same_range_same_data ( ) {
284
- let mut d = Data :: new ( b "foo bar baz") ;
290
+ let mut d = Data :: new ( "foo bar baz" ) ;
285
291
286
- d. replace_range ( 4 ..7 , b "lol") . unwrap ( ) ;
292
+ d. replace_range ( 4 ..7 , "lol" ) . unwrap ( ) ;
287
293
assert_eq ! ( "foo lol baz" , str ( & d. to_vec( ) ) ) ;
288
294
289
295
assert ! ( matches!(
290
- d. replace_range( 4 ..7 , b "lol") . unwrap_err( ) ,
296
+ d. replace_range( 4 ..7 , "lol" ) . unwrap_err( ) ,
291
297
Error :: AlreadyReplaced {
292
298
is_identical: true ,
293
299
..
@@ -297,28 +303,35 @@ mod tests {
297
303
298
304
#[ test]
299
305
fn broken_replacements ( ) {
300
- let mut d = Data :: new ( b "foo") ;
306
+ let mut d = Data :: new ( "foo" ) ;
301
307
assert ! ( matches!(
302
- d. replace_range( 4 ..8 , b "lol") . unwrap_err( ) ,
308
+ d. replace_range( 4 ..8 , "lol" ) . unwrap_err( ) ,
303
309
Error :: DataLengthExceeded ( std:: ops:: Range { start: 4 , end: 8 } , 3 ) ,
304
310
) ) ;
305
311
}
306
312
307
313
#[ test]
308
- fn replace_same_twice ( ) {
309
- let mut d = Data :: new ( b"foo" ) ;
310
- d. replace_range ( 0 ..1 , b"b" ) . unwrap ( ) ;
311
- d. replace_range ( 0 ..1 , b"b" ) . unwrap_err ( ) ;
312
- assert_eq ! ( "boo" , str ( & d. to_vec( ) ) ) ;
314
+ fn insert_same_twice ( ) {
315
+ let mut d = Data :: new ( "foo" ) ;
316
+ d. replace_range ( 1 ..1 , "b" ) . unwrap ( ) ;
317
+ assert_eq ! ( "fboo" , str ( & d. to_vec( ) ) ) ;
318
+ assert ! ( matches!(
319
+ d. replace_range( 1 ..1 , "b" ) . unwrap_err( ) ,
320
+ Error :: AlreadyReplaced {
321
+ is_identical: true ,
322
+ ..
323
+ } ,
324
+ ) ) ;
325
+ assert_eq ! ( "fboo" , str ( & d. to_vec( ) ) ) ;
313
326
}
314
327
315
328
#[ test]
316
329
fn commit_restore ( ) {
317
- let mut d = Data :: new ( b ", ") ;
330
+ let mut d = Data :: new ( ", " ) ;
318
331
assert_eq ! ( ", " , str ( & d. to_vec( ) ) ) ;
319
332
320
- d. replace_range ( 2 ..2 , b "world") . unwrap ( ) ;
321
- d. replace_range ( 0 ..0 , b "hello") . unwrap ( ) ;
333
+ d. replace_range ( 2 ..2 , "world" ) . unwrap ( ) ;
334
+ d. replace_range ( 0 ..0 , "hello" ) . unwrap ( ) ;
322
335
assert_eq ! ( "hello, world" , str ( & d. to_vec( ) ) ) ;
323
336
324
337
d. restore ( ) ;
@@ -327,14 +340,14 @@ mod tests {
327
340
d. commit ( ) ;
328
341
assert_eq ! ( ", " , str ( & d. to_vec( ) ) ) ;
329
342
330
- d. replace_range ( 2 ..2 , b "world") . unwrap ( ) ;
343
+ d. replace_range ( 2 ..2 , "world" ) . unwrap ( ) ;
331
344
assert_eq ! ( ", world" , str ( & d. to_vec( ) ) ) ;
332
345
d. commit ( ) ;
333
346
assert_eq ! ( ", world" , str ( & d. to_vec( ) ) ) ;
334
347
d. restore ( ) ;
335
348
assert_eq ! ( ", world" , str ( & d. to_vec( ) ) ) ;
336
349
337
- d. replace_range ( 0 ..0 , b "hello") . unwrap ( ) ;
350
+ d. replace_range ( 0 ..0 , "hello" ) . unwrap ( ) ;
338
351
assert_eq ! ( "hello, world" , str ( & d. to_vec( ) ) ) ;
339
352
d. commit ( ) ;
340
353
assert_eq ! ( "hello, world" , str ( & d. to_vec( ) ) ) ;
@@ -345,7 +358,7 @@ mod tests {
345
358
proptest ! {
346
359
#[ test]
347
360
fn new_to_vec_roundtrip( ref s in "\\ PC*" ) {
348
- assert_eq!( s. as_bytes( ) , Data :: new( s. as_bytes ( ) ) . to_vec( ) . as_slice ( ) ) ;
361
+ assert_eq!( s. as_bytes( ) , & Data :: new( s) . to_vec( ) ) ;
349
362
}
350
363
351
364
#[ test]
@@ -356,7 +369,7 @@ mod tests {
356
369
1 ..100 ,
357
370
)
358
371
) {
359
- let mut d = Data :: new( data. as_bytes ( ) ) ;
372
+ let mut d = Data :: new( data) ;
360
373
for & ( ref range, ref bytes) in replacements {
361
374
let _ = d. replace_range( range. clone( ) , bytes) ;
362
375
}
0 commit comments