@@ -474,6 +474,8 @@ impl Spec {
474474 }
475475}
476476
477+ /// Determine the width, potentially getting a value from args
478+ /// Returns the non-negative width and whether the value should be left-aligned.
477479fn resolve_asterisk_width < ' a > (
478480 option : Option < CanAsterisk < usize > > ,
479481 mut args : impl ArgumentIter < ' a > ,
@@ -492,6 +494,8 @@ fn resolve_asterisk_width<'a>(
492494 }
493495}
494496
497+ /// Determines the precision, which should (if defined)
498+ /// be a non-negative number.
495499fn resolve_asterisk_precision < ' a > (
496500 option : Option < CanAsterisk < usize > > ,
497501 mut args : impl ArgumentIter < ' a > ,
@@ -548,3 +552,110 @@ fn eat_number(rest: &mut &[u8], index: &mut usize) -> Option<usize> {
548552 }
549553 }
550554}
555+
556+ #[ cfg( test) ]
557+ mod tests {
558+ use super :: * ;
559+
560+ mod resolve_asterisk_width {
561+ use super :: * ;
562+ use crate :: format:: FormatArgument ;
563+
564+ #[ test]
565+ fn no_width ( ) {
566+ assert_eq ! ( None , resolve_asterisk_width( None , Vec :: new( ) . iter( ) ) ) ;
567+ }
568+
569+ #[ test]
570+ fn fixed_width ( ) {
571+ assert_eq ! (
572+ Some ( ( 42 , false ) ) ,
573+ resolve_asterisk_width( Some ( CanAsterisk :: Fixed ( 42 ) ) , Vec :: new( ) . iter( ) )
574+ ) ;
575+ }
576+
577+ #[ test]
578+ fn asterisks_with_numbers ( ) {
579+ assert_eq ! (
580+ Some ( ( 42 , false ) ) ,
581+ resolve_asterisk_width(
582+ Some ( CanAsterisk :: Asterisk ) ,
583+ vec![ FormatArgument :: SignedInt ( 42 ) ] . iter( )
584+ )
585+ ) ;
586+ assert_eq ! (
587+ Some ( ( 42 , false ) ) ,
588+ resolve_asterisk_width(
589+ Some ( CanAsterisk :: Asterisk ) ,
590+ vec![ FormatArgument :: Unparsed ( "42" . to_string( ) ) ] . iter( )
591+ )
592+ ) ;
593+
594+ assert_eq ! (
595+ Some ( ( 42 , true ) ) ,
596+ resolve_asterisk_width(
597+ Some ( CanAsterisk :: Asterisk ) ,
598+ vec![ FormatArgument :: SignedInt ( -42 ) ] . iter( )
599+ )
600+ ) ;
601+ assert_eq ! (
602+ Some ( ( 42 , true ) ) ,
603+ resolve_asterisk_width(
604+ Some ( CanAsterisk :: Asterisk ) ,
605+ vec![ FormatArgument :: Unparsed ( "-42" . to_string( ) ) ] . iter( )
606+ )
607+ ) ;
608+ }
609+ }
610+
611+ mod resolve_asterisk_precision {
612+ use super :: * ;
613+ use crate :: format:: FormatArgument ;
614+
615+ #[ test]
616+ fn no_width ( ) {
617+ assert_eq ! ( None , resolve_asterisk_precision( None , Vec :: new( ) . iter( ) ) ) ;
618+ }
619+
620+ #[ test]
621+ fn fixed_width ( ) {
622+ assert_eq ! (
623+ Some ( 42 ) ,
624+ resolve_asterisk_precision( Some ( CanAsterisk :: Fixed ( 42 ) ) , Vec :: new( ) . iter( ) )
625+ ) ;
626+ }
627+
628+ #[ test]
629+ fn asterisks_with_numbers ( ) {
630+ assert_eq ! (
631+ Some ( 42 ) ,
632+ resolve_asterisk_precision(
633+ Some ( CanAsterisk :: Asterisk ) ,
634+ vec![ FormatArgument :: SignedInt ( 42 ) ] . iter( )
635+ )
636+ ) ;
637+ assert_eq ! (
638+ Some ( 42 ) ,
639+ resolve_asterisk_precision(
640+ Some ( CanAsterisk :: Asterisk ) ,
641+ vec![ FormatArgument :: Unparsed ( "42" . to_string( ) ) ] . iter( )
642+ )
643+ ) ;
644+
645+ assert_eq ! (
646+ Some ( 0 ) ,
647+ resolve_asterisk_precision(
648+ Some ( CanAsterisk :: Asterisk ) ,
649+ vec![ FormatArgument :: SignedInt ( -42 ) ] . iter( )
650+ )
651+ ) ;
652+ assert_eq ! (
653+ Some ( 0 ) ,
654+ resolve_asterisk_precision(
655+ Some ( CanAsterisk :: Asterisk ) ,
656+ vec![ FormatArgument :: Unparsed ( "-42" . to_string( ) ) ] . iter( )
657+ )
658+ ) ;
659+ }
660+ }
661+ }
0 commit comments