@@ -12,8 +12,8 @@ use std::collections::hash_map::DefaultHasher;
12
12
use std:: hash:: { Hash , Hasher } ;
13
13
14
14
use super :: objint;
15
+ use super :: objsequence:: { is_valid_slice_arg, PySliceableSequence } ;
15
16
use super :: objtype;
16
- use super :: objsequence:: { PySliceableSequence , is_valid_slice_arg} ;
17
17
use crate :: obj:: objint:: PyInt ;
18
18
use num_integer:: Integer ;
19
19
use num_traits:: ToPrimitive ;
@@ -364,47 +364,66 @@ impl PyByteInner {
364
364
. collect :: < Vec < u8 > > ( ) )
365
365
}
366
366
367
- pub fn center ( & self , width_a : PyObjectRef , fillbyte : OptionalArg < PyObjectRef > , vm : & VirtualMachine ) -> PyResult < Vec < u8 > > {
367
+ fn get_center_args (
368
+ & self ,
369
+ width_a : PyObjectRef ,
370
+ fillbyte : OptionalArg < PyObjectRef > ,
371
+ fn_name : String ,
372
+ vm : & VirtualMachine ,
373
+ ) -> PyResult < ( u8 , usize ) > {
368
374
let fillbyte = if let OptionalArg :: Present ( v) = fillbyte {
369
375
match try_as_byte ( & v) {
370
376
Some ( x) => {
371
377
if x. len ( ) == 1 {
372
378
x[ 0 ]
373
379
} else {
374
380
return Err ( vm. new_type_error ( format ! (
375
- "center () argument 2 must be a byte string of length 1, not {}" ,
376
- & v
381
+ "{} () argument 2 must be a byte string of length 1, not {}" ,
382
+ & fn_name , & v
377
383
) ) ) ;
378
384
}
379
385
}
380
386
None => {
381
387
return Err ( vm. new_type_error ( format ! (
382
- "center () argument 2 must be a byte string of length 1, not {}" ,
383
- & v
388
+ "{} () argument 2 must be a byte string of length 1, not {}" ,
389
+ & fn_name , & v
384
390
) ) ) ;
385
391
}
386
392
}
387
393
} else {
388
- 32 // default is space
394
+ b' ' // default is space
389
395
} ;
390
396
391
- let width_b = match_class ! ( width_a,
397
+ let width_b = match_class ! ( width_a,
392
398
i @PyInt => i,
393
399
obj => { return Err ( vm. new_type_error( format!( "{} cannot be interpreted as an integer" , obj) ) ) ; }
394
400
) ;
395
401
396
-
397
402
// <0 = no change
398
403
let width = if let Some ( x) = width_b. as_bigint ( ) . to_usize ( ) {
399
- x
400
- } else { return Ok ( self . elements . clone ( ) ) ; } ;
401
-
404
+ if x <= self . len ( ) {
405
+ 0
406
+ } else {
407
+ x
408
+ }
409
+ } else {
410
+ 0
411
+ } ;
412
+
413
+ let diff: usize = if width != 0 { width - self . len ( ) } else { 0 } ;
414
+
415
+ Ok ( ( fillbyte, diff) )
416
+ }
417
+
418
+ pub fn center (
419
+ & self ,
420
+ width_a : PyObjectRef ,
421
+ fillbyte : OptionalArg < PyObjectRef > ,
422
+ vm : & VirtualMachine ,
423
+ ) -> PyResult < Vec < u8 > > {
424
+ let fn_name = "center" . to_string ( ) ;
425
+ let ( fillbyte, diff) = self . get_center_args ( width_a, fillbyte, fn_name, vm) ?;
402
426
403
- // adjust right et left side
404
- if width <= self . len ( ) {
405
- return Ok ( self . elements . clone ( ) ) ;
406
- }
407
- let diff: usize = width - self . len ( ) ;
408
427
let mut ln: usize = diff / 2 ;
409
428
let mut rn: usize = ln;
410
429
@@ -434,8 +453,7 @@ impl PyByteInner {
434
453
let sub = match try_as_bytes_like ( & sub) {
435
454
Some ( value) => value,
436
455
None => match_class ! ( sub,
437
- i @ PyInt =>
438
- vec![ i. as_bigint( ) . byte_or( vm) ?] ,
456
+ i @ PyInt => vec![ i. as_bigint( ) . byte_or( vm) ?] ,
439
457
obj => { return Err ( vm. new_type_error( format!( "argument should be integer or bytes-like object, not {}" , obj) ) ) ; } ) ,
440
458
} ;
441
459
let start = if let OptionalArg :: Present ( st) = start {
@@ -563,8 +581,7 @@ impl PyByteInner {
563
581
let sub = match try_as_bytes_like ( & sub) {
564
582
Some ( value) => value,
565
583
None => match_class ! ( sub,
566
- i @ PyInt =>
567
- vec![ i. as_bigint( ) . byte_or( vm) ?] ,
584
+ i @ PyInt => vec![ i. as_bigint( ) . byte_or( vm) ?] ,
568
585
obj => { return Err ( vm. new_type_error( format!( "a bytes-like object is required, not {}" , obj) ) ) ; } ) ,
569
586
} ;
570
587
@@ -582,63 +599,78 @@ impl PyByteInner {
582
599
583
600
let slice = & self . elements [ range] ;
584
601
for ( n, _) in slice. iter ( ) . enumerate ( ) {
585
- if n + sub. len ( ) <= slice. len ( )
586
- && & slice[ n..n + sub. len ( ) ] == sub. as_slice ( )
587
- {
588
- return Ok ( ( start+n) as isize ) ;
602
+ if n + sub. len ( ) <= slice. len ( ) && & slice[ n..n + sub. len ( ) ] == sub. as_slice ( ) {
603
+ return Ok ( ( start + n) as isize ) ;
589
604
}
590
605
}
591
606
Ok ( -1isize )
592
607
}
593
608
594
- pub fn maketrans ( from : PyObjectRef , to : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
595
- let mut res = vec ! [ ] ;
609
+ pub fn maketrans ( from : PyObjectRef , to : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
610
+ let mut res = vec ! [ ] ;
596
611
597
612
let from = match try_as_bytes_like ( & from) {
598
613
Some ( value) => value,
599
- None => { return Err ( vm. new_type_error ( format ! ( "a bytes-like object is required, not {}" , from) ) ) ; } ,
614
+ None => {
615
+ return Err (
616
+ vm. new_type_error ( format ! ( "a bytes-like object is required, not {}" , from) )
617
+ ) ;
618
+ }
600
619
} ;
601
620
602
621
let to = match try_as_bytes_like ( & to) {
603
622
Some ( value) => value,
604
- None => { return Err ( vm. new_type_error ( format ! ( "a bytes-like object is required, not {}" , to) ) ) ; } ,
623
+ None => {
624
+ return Err (
625
+ vm. new_type_error ( format ! ( "a bytes-like object is required, not {}" , to) )
626
+ ) ;
627
+ }
605
628
} ;
606
629
607
630
for i in 0 ..=255 {
608
- res. push ( if let Some ( position) = from. iter ( ) . position ( |& x| x ==i) {
631
+ res. push ( if let Some ( position) = from. iter ( ) . position ( |& x| x == i) {
609
632
to[ position]
610
- } else {
633
+ } else {
611
634
i
612
635
} ) ;
613
636
}
614
637
615
638
Ok ( vm. ctx . new_bytes ( res) )
616
639
}
617
- pub fn translate ( & self , table : PyObjectRef , delete : OptionalArg < PyObjectRef > , vm : & VirtualMachine ) -> PyResult {
640
+ pub fn translate (
641
+ & self ,
642
+ table : PyObjectRef ,
643
+ delete : OptionalArg < PyObjectRef > ,
644
+ vm : & VirtualMachine ,
645
+ ) -> PyResult {
618
646
let table = match try_as_bytes_like ( & table) {
619
647
Some ( value) => value,
620
- None => {
621
- match_class ! ( table,
648
+ None => match_class ! ( table,
622
649
623
- _n @ PyNone => ( 0 ..=255 ) . collect:: <Vec <u8 >>( ) ,
624
- obj => { return Err ( vm. new_type_error( format!( "a bytes-like object is required, not {}" , obj) ) ) ; } ,
625
- )
626
- }
650
+ _n @ PyNone => ( 0 ..=255 ) . collect:: <Vec <u8 >>( ) ,
651
+ obj => { return Err ( vm. new_type_error( format!( "a bytes-like object is required, not {}" , obj) ) ) ; } ,
652
+ ) ,
627
653
} ;
628
654
629
655
if table. len ( ) != 256 {
630
- return Err ( vm. new_value_error ( "translation table must be 256 characters long" . to_string ( ) ) ) ;
656
+ return Err (
657
+ vm. new_value_error ( "translation table must be 256 characters long" . to_string ( ) )
658
+ ) ;
631
659
}
632
660
633
-
634
-
635
661
let delete = if let OptionalArg :: Present ( value) = delete {
636
- match try_as_bytes_like ( & value) {
662
+ match try_as_bytes_like ( & value) {
637
663
Some ( value) => value,
638
- None => { return Err ( vm. new_type_error ( format ! ( "a bytes-like object is required, not {}" , value) ) ) ; }
664
+ None => {
665
+ return Err ( vm. new_type_error ( format ! (
666
+ "a bytes-like object is required, not {}" ,
667
+ value
668
+ ) ) ) ;
669
+ }
639
670
}
640
- } else { vec ! [ ] } ;
641
-
671
+ } else {
672
+ vec ! [ ]
673
+ } ;
642
674
643
675
let mut res = vec ! [ ] ;
644
676
0 commit comments