@@ -25,8 +25,46 @@ pub struct Formattable<'a> {
2525 iter : Option < & ' a [ Formattable < ' a > ] > ,
2626}
2727
28+ struct PlainString ( & ' static str ) ;
29+
30+ impl Debug for PlainString {
31+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
32+ write ! ( f, "{}" , self . 0 )
33+ }
34+ }
35+
36+ macro_rules! formattable_debug {
37+ ( $( $field: ident $( : $feature: literal) ?) ,+ $( , ) ?) => {
38+ impl Debug for Formattable <' _> {
39+ fn fmt( & self , f: & mut std:: fmt:: Formatter <' _>) -> std:: fmt:: Result {
40+ let mut tuple = f. debug_tuple( "Formattable" ) ;
41+ $(
42+ $( #[ cfg( feature = $feature) ] ) ?
43+ if self . $field. is_some( ) {
44+ tuple. field( & PlainString ( stringify!( $field) ) ) ;
45+ }
46+ ) *
47+ tuple. finish( )
48+ }
49+ }
50+ } ;
51+ }
52+
53+ formattable_debug ! {
54+ debug: "debug" ,
55+ display,
56+ binary: "number" ,
57+ lower_exp: "number" ,
58+ lower_hex: "number" ,
59+ octal: "number" ,
60+ upper_exp: "number" ,
61+ upper_hex: "number" ,
62+ pointer: "pointer" ,
63+ iter: "iter"
64+ }
65+
2866macro_rules! formattable_fn {
29- ( ( $( $cfg: tt) * ) , ( $doc: expr) , $name: ident, $builder: ident<$( $traits: ident) ,* > $( $fields: ident) ,+) => {
67+ ( ( $( $cfg: tt) * ) , ( $doc: expr) , $name: ident, $builder: ident, $setter : ident <$( $traits: ident) ,* > $( $fields: ident) ,+) => {
3068 /// Creates a [`Formattable`] from a value implementing
3169 #[ doc = $doc]
3270 $( $cfg) * pub fn $name<T : $( $traits+) * >( value: & ' a T ) -> Self {
@@ -42,36 +80,41 @@ macro_rules! formattable_fn {
4280 $( self . $fields = Some ( value) ; ) *
4381 self
4482 }
83+ /// Sets implementation for
84+ #[ doc = $doc]
85+ $( $cfg) * pub fn $setter<T : $( $traits+) * >( & mut self , value: & ' a T ) {
86+ $( self . $fields = Some ( value) ; ) *
87+ }
4588 } ;
46- ( ( $( $cfg: tt) * ) , ( ) , $name: ident, $builder: ident, $getter: ident<$trait: ident>) => {
47- formattable_fn!( ( $( $cfg) * ) , ( concat!( "[`" , stringify!( $trait) , "`]" ) ) , $name, $builder<$trait> $name) ;
89+ ( ( $( $cfg: tt) * ) , ( ) , $name: ident, $builder: ident, $setter : ident , $ getter: ident<$trait: ident>) => {
90+ formattable_fn!( ( $( $cfg) * ) , ( concat!( "[`" , stringify!( $trait) , "`]" ) ) , $name, $builder, $setter <$trait> $name) ;
4891 $( $cfg) * pub ( crate ) fn $getter( & self ) -> Result <& dyn $trait, Trait > {
4992 self . $name. ok_or( Trait :: $trait)
5093 }
5194 } ;
5295}
5396macro_rules! formattable {
54- [ $( $( $cfg: literal, $( $doc: literal, ) ?) ? $name: ident, $builder: ident$( , $getter: ident) ?<$( $traits: ident) ,* > $( $fields: ident) ,* ; ) * ] => {
97+ [ $( $( $cfg: literal, $( $doc: literal, ) ?) ? $name: ident, $builder: ident, $setter : ident $( , $getter: ident) ?<$( $traits: ident) ,* > $( $fields: ident) ,* ; ) * ] => {
5598 impl <' a> Formattable <' a> {
56- $( formattable_fn!( ( $( #[ cfg( feature=$cfg) ] ) ?) , ( $( $( $doc) ?) ?) , $name, $builder$( , $getter) ?<$( $traits) ,* > $( $fields) ,* ) ; ) *
99+ $( formattable_fn!( ( $( #[ cfg( feature=$cfg) ] ) ?) , ( $( $( $doc) ?) ?) , $name, $builder, $setter $( , $getter) ?<$( $traits) ,* > $( $fields) ,* ) ; ) *
57100 }
58101 } ;
59102}
60103
61104formattable ! [
62- "debug" , "[`Debug`] and [`Display`]" , debug_display, and_debug_display<Debug , Display > debug, display;
63- "debug" , debug, and_debug, get_debug<Debug >;
64- display, and_display, get_display<Display >;
65- "number" , "[`Debug`], [`Display`], [`Octal`], [`LowerHex`], [`UpperHex`], [`Binary`], [`LowerExp`] and [`UpperExp`]" , integer, and_integer<Binary , Debug , Display , LowerExp , LowerHex , Octal , UpperExp , UpperHex >
105+ "debug" , "[`Debug`] and [`Display`]" , debug_display, and_debug_display, set_debug_display <Debug , Display > debug, display;
106+ "debug" , debug, and_debug, set_debug , get_debug<Debug >;
107+ display, and_display, set_display , get_display<Display >;
108+ "number" , "[`Debug`], [`Display`], [`Octal`], [`LowerHex`], [`UpperHex`], [`Binary`], [`LowerExp`] and [`UpperExp`]" , integer, and_integer, set_integer <Binary , Debug , Display , LowerExp , LowerHex , Octal , UpperExp , UpperHex >
66109 binary, debug, display, lower_exp, lower_hex, octal, upper_exp, upper_hex;
67- "number" , "[`Debug`], [`Display`], [`LowerExp`] and [`UpperExp`]" , float, and_float<Debug , Display , LowerExp , UpperExp >
110+ "number" , "[`Debug`], [`Display`], [`LowerExp`] and [`UpperExp`]" , float, and_float, set_float <Debug , Display , LowerExp , UpperExp >
68111 debug, display, lower_exp, upper_exp;
69- "number" , binary, and_binary, get_binary<Binary >;
70- "number" , lower_exp, and_lower_exp, get_lower_exp<LowerExp >;
71- "number" , lower_hex, and_lower_hex, get_lower_hex<LowerHex >;
72- "number" , octal, and_octal, get_octal<Octal >;
73- "number" , upper_exp, and_upper_exp, get_upper_exp<UpperExp >;
74- "number" , upper_hex, and_upper_hex, get_upper_hex<UpperHex >;
112+ "number" , binary, and_binary, set_binary , get_binary<Binary >;
113+ "number" , lower_exp, and_lower_exp, set_lower_exp , get_lower_exp<LowerExp >;
114+ "number" , lower_hex, and_lower_hex, set_lower_hex , get_lower_hex<LowerHex >;
115+ "number" , octal, and_octal, set_octal , get_octal<Octal >;
116+ "number" , upper_exp, and_upper_exp, set_upper_exp , get_upper_exp<UpperExp >;
117+ "number" , upper_hex, and_upper_hex, set_upper_hex , get_upper_hex<UpperHex >;
75118] ;
76119
77120#[ cfg( feature = "pointer" ) ]
@@ -87,6 +130,11 @@ impl<'a> Formattable<'a> {
87130 self
88131 }
89132
133+ /// Sets implementation for [`Pointer`]
134+ pub fn set_pointer < T : Pointer > ( & mut self , value : & ' a T ) {
135+ self . pointer = Some ( PointerWrapper ( value) ) ;
136+ }
137+
90138 pub ( crate ) fn get_pointer ( & self ) -> Result < PointerWrapper , Trait > {
91139 self . pointer . ok_or ( Trait :: Pointer )
92140 }
@@ -105,6 +153,11 @@ impl<'a> Formattable<'a> {
105153 self
106154 }
107155
156+ /// Sets implementation for mapping operations
157+ pub fn set_iter ( & mut self , value : & ' a [ Formattable < ' a > ] ) {
158+ self . iter = Some ( value) ;
159+ }
160+
108161 pub ( crate ) fn get_iter ( & self ) -> Result < & ' a [ Formattable < ' a > ] , Trait > {
109162 self . iter . ok_or ( Trait :: Iter )
110163 }
0 commit comments