@@ -116,7 +116,7 @@ impl ByteInnerFindOptions {
116
116
elements : & [ u8 ] ,
117
117
vm : & VirtualMachine ,
118
118
) -> PyResult < ( Vec < u8 > , Range < usize > ) > {
119
- let sub = match try_as_bytes_like ( & self . sub . clone ( ) ) {
119
+ let sub = match try_as_bytes_like ( & self . sub ) {
120
120
Some ( value) => value,
121
121
None => match_class ! ( self . sub,
122
122
i @ PyInt => vec![ i. as_bigint( ) . byte_or( vm) ?] ,
@@ -147,6 +147,56 @@ impl ByteInnerFindOptions {
147
147
}
148
148
}
149
149
150
+ #[ derive( FromArgs ) ]
151
+ pub struct ByteInnerPaddingOptions {
152
+ #[ pyarg( positional_only, optional = false ) ]
153
+ width : PyIntRef ,
154
+ #[ pyarg( positional_only, optional = true ) ]
155
+ fillbyte : OptionalArg < PyObjectRef > ,
156
+ }
157
+
158
+ impl ByteInnerPaddingOptions {
159
+ fn get_value ( & self , fn_name : & str , len : usize , vm : & VirtualMachine ) -> PyResult < ( u8 , usize ) > {
160
+ let fillbyte = if let OptionalArg :: Present ( v) = & self . fillbyte {
161
+ match try_as_byte ( & v) {
162
+ Some ( x) => {
163
+ if x. len ( ) == 1 {
164
+ x[ 0 ]
165
+ } else {
166
+ return Err ( vm. new_type_error ( format ! (
167
+ "{}() argument 2 must be a byte string of length 1, not {}" ,
168
+ fn_name, & v
169
+ ) ) ) ;
170
+ }
171
+ }
172
+ None => {
173
+ return Err ( vm. new_type_error ( format ! (
174
+ "{}() argument 2 must be a byte string of length 1, not {}" ,
175
+ fn_name, & v
176
+ ) ) ) ;
177
+ }
178
+ }
179
+ } else {
180
+ b' ' // default is space
181
+ } ;
182
+
183
+ // <0 = no change
184
+ let width = if let Some ( x) = self . width . as_bigint ( ) . to_usize ( ) {
185
+ if x <= len {
186
+ 0
187
+ } else {
188
+ x
189
+ }
190
+ } else {
191
+ 0
192
+ } ;
193
+
194
+ let diff: usize = if width != 0 { width - len } else { 0 } ;
195
+
196
+ Ok ( ( fillbyte, diff) )
197
+ }
198
+ }
199
+
150
200
impl PyByteInner {
151
201
pub fn repr ( & self ) -> PyResult < String > {
152
202
let mut res = String :: with_capacity ( self . elements . len ( ) ) ;
@@ -423,60 +473,13 @@ impl PyByteInner {
423
473
. collect :: < Vec < u8 > > ( ) )
424
474
}
425
475
426
- fn get_center_args (
427
- & self ,
428
- width : PyIntRef ,
429
- fillbyte : OptionalArg < PyObjectRef > ,
430
- fn_name : String ,
431
- vm : & VirtualMachine ,
432
- ) -> PyResult < ( u8 , usize ) > {
433
- let fillbyte = if let OptionalArg :: Present ( v) = fillbyte {
434
- match try_as_byte ( & v) {
435
- Some ( x) => {
436
- if x. len ( ) == 1 {
437
- x[ 0 ]
438
- } else {
439
- return Err ( vm. new_type_error ( format ! (
440
- "{}() argument 2 must be a byte string of length 1, not {}" ,
441
- & fn_name, & v
442
- ) ) ) ;
443
- }
444
- }
445
- None => {
446
- return Err ( vm. new_type_error ( format ! (
447
- "{}() argument 2 must be a byte string of length 1, not {}" ,
448
- & fn_name, & v
449
- ) ) ) ;
450
- }
451
- }
452
- } else {
453
- b' ' // default is space
454
- } ;
455
-
456
- // <0 = no change
457
- let width = if let Some ( x) = width. as_bigint ( ) . to_usize ( ) {
458
- if x <= self . len ( ) {
459
- 0
460
- } else {
461
- x
462
- }
463
- } else {
464
- 0
465
- } ;
466
-
467
- let diff: usize = if width != 0 { width - self . len ( ) } else { 0 } ;
468
-
469
- Ok ( ( fillbyte, diff) )
470
- }
471
-
472
476
pub fn center (
473
477
& self ,
474
- width : PyIntRef ,
475
- fillbyte : OptionalArg < PyObjectRef > ,
478
+ options : ByteInnerPaddingOptions ,
476
479
vm : & VirtualMachine ,
477
480
) -> PyResult < Vec < u8 > > {
478
- let fn_name = "center" . to_string ( ) ;
479
- let ( fillbyte, diff) = self . get_center_args ( width , fillbyte , fn_name , vm) ?;
481
+ // let fn_name = "center".to_string();
482
+ let ( fillbyte, diff) = options . get_value ( "center" , self . len ( ) , vm) ?;
480
483
481
484
let mut ln: usize = diff / 2 ;
482
485
let mut rn: usize = ln;
@@ -499,12 +502,11 @@ impl PyByteInner {
499
502
500
503
pub fn ljust (
501
504
& self ,
502
- width : PyIntRef ,
503
- fillbyte : OptionalArg < PyObjectRef > ,
505
+ options : ByteInnerPaddingOptions ,
504
506
vm : & VirtualMachine ,
505
507
) -> PyResult < Vec < u8 > > {
506
- let fn_name = "ljust" . to_string ( ) ;
507
- let ( fillbyte, diff) = self . get_center_args ( width , fillbyte , fn_name , vm) ?;
508
+ // let fn_name = "ljust".to_string();
509
+ let ( fillbyte, diff) = options . get_value ( "ljust" , self . len ( ) , vm) ?;
508
510
509
511
// merge all
510
512
let mut res = vec ! [ ] ;
@@ -516,12 +518,11 @@ impl PyByteInner {
516
518
517
519
pub fn rjust (
518
520
& self ,
519
- width : PyIntRef ,
520
- fillbyte : OptionalArg < PyObjectRef > ,
521
+ options : ByteInnerPaddingOptions ,
521
522
vm : & VirtualMachine ,
522
523
) -> PyResult < Vec < u8 > > {
523
- let fn_name = "ljust " . to_string ( ) ;
524
- let ( fillbyte, diff) = self . get_center_args ( width , fillbyte , fn_name , vm) ?;
524
+ // let fn_name = "rjust ".to_string();
525
+ let ( fillbyte, diff) = options . get_value ( "rjust" , self . len ( ) , vm) ?;
525
526
526
527
// merge all
527
528
let mut res = vec ! [ fillbyte; diff] ;
0 commit comments