@@ -25,8 +25,46 @@ pub struct Formattable<'a> {
25
25
iter : Option < & ' a [ Formattable < ' a > ] > ,
26
26
}
27
27
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
+
28
66
macro_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) ,+) => {
30
68
/// Creates a [`Formattable`] from a value implementing
31
69
#[ doc = $doc]
32
70
$( $cfg) * pub fn $name<T : $( $traits+) * >( value: & ' a T ) -> Self {
@@ -42,36 +80,41 @@ macro_rules! formattable_fn {
42
80
$( self . $fields = Some ( value) ; ) *
43
81
self
44
82
}
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
+ }
45
88
} ;
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) ;
48
91
$( $cfg) * pub ( crate ) fn $getter( & self ) -> Result <& dyn $trait, Trait > {
49
92
self . $name. ok_or( Trait :: $trait)
50
93
}
51
94
} ;
52
95
}
53
96
macro_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) ,* ; ) * ] => {
55
98
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) ,* ) ; ) *
57
100
}
58
101
} ;
59
102
}
60
103
61
104
formattable ! [
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 >
66
109
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 >
68
111
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 >;
75
118
] ;
76
119
77
120
#[ cfg( feature = "pointer" ) ]
@@ -87,6 +130,11 @@ impl<'a> Formattable<'a> {
87
130
self
88
131
}
89
132
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
+
90
138
pub ( crate ) fn get_pointer ( & self ) -> Result < PointerWrapper , Trait > {
91
139
self . pointer . ok_or ( Trait :: Pointer )
92
140
}
@@ -105,6 +153,11 @@ impl<'a> Formattable<'a> {
105
153
self
106
154
}
107
155
156
+ /// Sets implementation for mapping operations
157
+ pub fn set_iter ( & mut self , value : & ' a [ Formattable < ' a > ] ) {
158
+ self . iter = Some ( value) ;
159
+ }
160
+
108
161
pub ( crate ) fn get_iter ( & self ) -> Result < & ' a [ Formattable < ' a > ] , Trait > {
109
162
self . iter . ok_or ( Trait :: Iter )
110
163
}
0 commit comments