10
10
11
11
use fmt;
12
12
13
- struct PadAdapter < ' a , ' b : ' a > {
14
- fmt : & ' a mut fmt:: Formatter < ' b > ,
13
+ struct PadAdapter < ' a > {
14
+ buf : & ' a mut ( fmt:: Write + ' a ) ,
15
15
on_newline : bool ,
16
16
}
17
17
18
- impl < ' a , ' b : ' a > PadAdapter < ' a , ' b > {
19
- fn new ( fmt : & ' a mut fmt:: Formatter < ' b > ) -> PadAdapter < ' a , ' b > {
20
- PadAdapter {
21
- fmt,
22
- on_newline : false ,
23
- }
24
- }
25
-
26
- fn as_formatter ( & mut self ) -> fmt:: Formatter {
27
- fmt:: Formatter {
28
- // These only exist in the struct for the `Formatter::run` method,
29
- // which won’t be used.
30
- curarg : self . fmt . curarg . clone ( ) ,
31
- args : self . fmt . args ,
32
-
33
- // We want to preserve these
34
- flags : self . fmt . flags ,
35
- fill : self . fmt . fill ,
36
- align : self . fmt . align ,
37
- width : self . fmt . width ,
38
- precision : self . fmt . precision ,
39
-
40
- // And change this
41
- buf : self ,
42
- }
18
+ impl < ' a > PadAdapter < ' a > {
19
+ fn wrap < ' b , ' c : ' a +' b > ( fmt : & ' c mut fmt:: Formatter , slot : & ' b mut Option < Self > )
20
+ -> fmt:: Formatter < ' b > {
21
+ fmt. wrap_buf ( move |buf| {
22
+ * slot = Some ( PadAdapter {
23
+ buf,
24
+ on_newline : false ,
25
+ } ) ;
26
+ slot. as_mut ( ) . unwrap ( )
27
+ } )
43
28
}
44
29
}
45
30
46
- impl < ' a , ' b : ' a > fmt:: Write for PadAdapter < ' a , ' b > {
31
+ impl < ' a > fmt:: Write for PadAdapter < ' a > {
47
32
fn write_str ( & mut self , mut s : & str ) -> fmt:: Result {
48
33
while !s. is_empty ( ) {
49
34
if self . on_newline {
50
- self . fmt . write_str ( " " ) ?;
35
+ self . buf . write_str ( " " ) ?;
51
36
}
52
37
53
38
let split = match s. find ( '\n' ) {
@@ -60,7 +45,7 @@ impl<'a, 'b: 'a> fmt::Write for PadAdapter<'a, 'b> {
60
45
s. len ( )
61
46
}
62
47
} ;
63
- self . fmt . write_str ( & s[ ..split] ) ?;
48
+ self . buf . write_str ( & s[ ..split] ) ?;
64
49
s = & s[ split..] ;
65
50
}
66
51
@@ -131,13 +116,13 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
131
116
} ;
132
117
133
118
if self . is_pretty ( ) {
134
- use fmt :: Write ;
135
- let mut writer = PadAdapter :: new ( self . fmt ) ;
119
+ let mut slot = None ;
120
+ let mut writer = PadAdapter :: wrap ( & mut self . fmt , & mut slot ) ;
136
121
writer. write_str ( prefix) ?;
137
122
writer. write_str ( "\n " ) ?;
138
123
writer. write_str ( name) ?;
139
124
writer. write_str ( ": " ) ?;
140
- value. fmt ( & mut writer. as_formatter ( ) )
125
+ value. fmt ( & mut writer)
141
126
} else {
142
127
write ! ( self . fmt, "{} {}: " , prefix, name) ?;
143
128
value. fmt ( self . fmt )
@@ -228,11 +213,11 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> {
228
213
} ;
229
214
230
215
if self . is_pretty ( ) {
231
- use fmt :: Write ;
232
- let mut writer = PadAdapter :: new ( self . fmt ) ;
216
+ let mut slot = None ;
217
+ let mut writer = PadAdapter :: wrap ( & mut self . fmt , & mut slot ) ;
233
218
writer. write_str ( prefix) ?;
234
219
writer. write_str ( "\n " ) ?;
235
- value. fmt ( & mut writer. as_formatter ( ) )
220
+ value. fmt ( & mut writer)
236
221
} else {
237
222
self . fmt . write_str ( prefix) ?;
238
223
self . fmt . write_str ( space) ?;
@@ -276,14 +261,14 @@ impl<'a, 'b: 'a> DebugInner<'a, 'b> {
276
261
fn entry ( & mut self , entry : & fmt:: Debug ) {
277
262
self . result = self . result . and_then ( |_| {
278
263
if self . is_pretty ( ) {
279
- use fmt :: Write ;
280
- let mut writer = PadAdapter :: new ( self . fmt ) ;
264
+ let mut slot = None ;
265
+ let mut writer = PadAdapter :: wrap ( & mut self . fmt , & mut slot ) ;
281
266
writer. write_str ( if self . has_fields {
282
267
",\n "
283
268
} else {
284
269
"\n "
285
270
} ) ?;
286
- entry. fmt ( & mut writer. as_formatter ( ) )
271
+ entry. fmt ( & mut writer)
287
272
} else {
288
273
if self . has_fields {
289
274
self . fmt . write_str ( ", " ) ?
@@ -500,16 +485,16 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
500
485
pub fn entry ( & mut self , key : & fmt:: Debug , value : & fmt:: Debug ) -> & mut DebugMap < ' a , ' b > {
501
486
self . result = self . result . and_then ( |_| {
502
487
if self . is_pretty ( ) {
503
- use fmt :: Write ;
504
- let mut writer = PadAdapter :: new ( self . fmt ) ;
488
+ let mut slot = None ;
489
+ let mut writer = PadAdapter :: wrap ( & mut self . fmt , & mut slot ) ;
505
490
writer. write_str ( if self . has_fields {
506
491
",\n "
507
492
} else {
508
493
"\n "
509
494
} ) ?;
510
- key. fmt ( & mut writer. as_formatter ( ) ) ?;
495
+ key. fmt ( & mut writer) ?;
511
496
writer. write_str ( ": " ) ?;
512
- value. fmt ( & mut writer. as_formatter ( ) )
497
+ value. fmt ( & mut writer)
513
498
} else {
514
499
if self . has_fields {
515
500
self . fmt . write_str ( ", " ) ?
0 commit comments