@@ -2,9 +2,8 @@ use std::fmt;
2
2
use std:: io:: prelude:: * ;
3
3
use std:: io:: IsTerminal ;
4
4
5
+ use anstream:: AutoStream ;
5
6
use anstyle:: Style ;
6
- use anstyle_termcolor:: to_termcolor_spec;
7
- use termcolor:: { self , BufferWriter , StandardStream , WriteColor } ;
8
7
9
8
use crate :: util:: errors:: CargoResult ;
10
9
use crate :: util:: style:: * ;
@@ -86,10 +85,8 @@ enum ShellOut {
86
85
/// corresponding stream. The non-buffered fields should be used when you
87
86
/// do not want content to be buffered.
88
87
Stream {
89
- stdout : StandardStream ,
90
- buffered_stdout : BufferWriter ,
91
- stderr : StandardStream ,
92
- buffered_stderr : BufferWriter ,
88
+ stdout : AutoStream < std:: io:: Stdout > ,
89
+ stderr : AutoStream < std:: io:: Stderr > ,
93
90
stderr_tty : bool ,
94
91
color_choice : ColorChoice ,
95
92
} ,
@@ -111,15 +108,13 @@ impl Shell {
111
108
/// output.
112
109
pub fn new ( ) -> Shell {
113
110
let auto_clr = ColorChoice :: CargoAuto ;
114
- let stdout_choice = auto_clr. to_termcolor_color_choice ( Stream :: Stdout ) ;
115
- let stderr_choice = auto_clr. to_termcolor_color_choice ( Stream :: Stderr ) ;
111
+ let stdout_choice = auto_clr. to_anstream_color_choice ( ) ;
112
+ let stderr_choice = auto_clr. to_anstream_color_choice ( ) ;
116
113
Shell {
117
114
output : ShellOut :: Stream {
118
- stdout : StandardStream :: stdout ( stdout_choice) ,
119
- buffered_stdout : BufferWriter :: stdout ( stdout_choice) ,
120
- stderr : StandardStream :: stderr ( stderr_choice) ,
121
- buffered_stderr : BufferWriter :: stderr ( stderr_choice) ,
122
- color_choice : ColorChoice :: CargoAuto ,
115
+ stdout : AutoStream :: new ( std:: io:: stdout ( ) , stdout_choice) ,
116
+ stderr : AutoStream :: new ( std:: io:: stderr ( ) , stderr_choice) ,
117
+ color_choice : auto_clr,
123
118
stderr_tty : std:: io:: stderr ( ) . is_terminal ( ) ,
124
119
} ,
125
120
verbosity : Verbosity :: Verbose ,
@@ -297,9 +292,7 @@ impl Shell {
297
292
pub fn set_color_choice ( & mut self , color : Option < & str > ) -> CargoResult < ( ) > {
298
293
if let ShellOut :: Stream {
299
294
ref mut stdout,
300
- ref mut buffered_stdout,
301
295
ref mut stderr,
302
- ref mut buffered_stderr,
303
296
ref mut color_choice,
304
297
..
305
298
} = self . output
@@ -317,12 +310,10 @@ impl Shell {
317
310
) ,
318
311
} ;
319
312
* color_choice = cfg;
320
- let stdout_choice = cfg. to_termcolor_color_choice ( Stream :: Stdout ) ;
321
- let stderr_choice = cfg. to_termcolor_color_choice ( Stream :: Stderr ) ;
322
- * stdout = StandardStream :: stdout ( stdout_choice) ;
323
- * buffered_stdout = BufferWriter :: stdout ( stdout_choice) ;
324
- * stderr = StandardStream :: stderr ( stderr_choice) ;
325
- * buffered_stderr = BufferWriter :: stderr ( stderr_choice) ;
313
+ let stdout_choice = cfg. to_anstream_color_choice ( ) ;
314
+ let stderr_choice = cfg. to_anstream_color_choice ( ) ;
315
+ * stdout = AutoStream :: new ( std:: io:: stdout ( ) , stdout_choice) ;
316
+ * stderr = AutoStream :: new ( std:: io:: stderr ( ) , stderr_choice) ;
326
317
}
327
318
Ok ( ( ) )
328
319
}
@@ -342,14 +333,14 @@ impl Shell {
342
333
pub fn err_supports_color ( & self ) -> bool {
343
334
match & self . output {
344
335
ShellOut :: Write ( _) => false ,
345
- ShellOut :: Stream { stderr, .. } => stderr. supports_color ( ) ,
336
+ ShellOut :: Stream { stderr, .. } => supports_color ( stderr. current_choice ( ) ) ,
346
337
}
347
338
}
348
339
349
340
pub fn out_supports_color ( & self ) -> bool {
350
341
match & self . output {
351
342
ShellOut :: Write ( _) => false ,
352
- ShellOut :: Stream { stdout, .. } => stdout. supports_color ( ) ,
343
+ ShellOut :: Stream { stdout, .. } => supports_color ( stdout. current_choice ( ) ) ,
353
344
}
354
345
}
355
346
@@ -372,13 +363,6 @@ impl Shell {
372
363
if self . needs_clear {
373
364
self . err_erase_line ( ) ;
374
365
}
375
- #[ cfg( windows) ]
376
- {
377
- if let ShellOut :: Stream { stderr, .. } = & mut self . output {
378
- :: fwdansi:: write_ansi ( stderr, message) ?;
379
- return Ok ( ( ) ) ;
380
- }
381
- }
382
366
self . err ( ) . write_all ( message) ?;
383
367
Ok ( ( ) )
384
368
}
@@ -388,13 +372,6 @@ impl Shell {
388
372
if self . needs_clear {
389
373
self . err_erase_line ( ) ;
390
374
}
391
- #[ cfg( windows) ]
392
- {
393
- if let ShellOut :: Stream { stdout, .. } = & mut self . output {
394
- :: fwdansi:: write_ansi ( stdout, message) ?;
395
- return Ok ( ( ) ) ;
396
- }
397
- }
398
375
self . out ( ) . write_all ( message) ?;
399
376
Ok ( ( ) )
400
377
}
@@ -426,26 +403,22 @@ impl ShellOut {
426
403
justified : bool ,
427
404
) -> CargoResult < ( ) > {
428
405
match * self {
429
- ShellOut :: Stream {
430
- ref mut buffered_stderr,
431
- ..
432
- } => {
433
- let mut buffer = buffered_stderr. buffer ( ) ;
434
- buffer. reset ( ) ?;
435
- buffer. set_color ( & to_termcolor_spec ( * style) ) ?;
406
+ ShellOut :: Stream { ref mut stderr, .. } => {
407
+ let style = style. render ( ) ;
408
+ let bold = ( anstyle:: Style :: new ( ) | anstyle:: Effects :: BOLD ) . render ( ) ;
409
+ let reset = anstyle:: Reset . render ( ) ;
410
+
411
+ let mut buffer = Vec :: new ( ) ;
436
412
if justified {
437
- write ! ( buffer, "{:>12}" , status ) ?;
413
+ write ! ( & mut buffer, "{style}{status :>12}{reset}" ) ?;
438
414
} else {
439
- write ! ( buffer, "{}" , status) ?;
440
- buffer. set_color ( termcolor:: ColorSpec :: new ( ) . set_bold ( true ) ) ?;
441
- write ! ( buffer, ":" ) ?;
415
+ write ! ( & mut buffer, "{style}{status}{reset}{bold}:{reset}" ) ?;
442
416
}
443
- buffer. reset ( ) ?;
444
417
match message {
445
- Some ( message) => writeln ! ( buffer, " {}" , message ) ?,
418
+ Some ( message) => writeln ! ( buffer, " {message}" ) ?,
446
419
None => write ! ( buffer, " " ) ?,
447
420
}
448
- buffered_stderr . print ( & buffer) ?;
421
+ stderr . write_all ( & buffer) ?;
449
422
}
450
423
ShellOut :: Write ( ref mut w) => {
451
424
if justified {
@@ -463,18 +436,15 @@ impl ShellOut {
463
436
}
464
437
465
438
/// Write a styled fragment
466
- fn write_stdout ( & mut self , fragment : impl fmt:: Display , color : & Style ) -> CargoResult < ( ) > {
439
+ fn write_stdout ( & mut self , fragment : impl fmt:: Display , style : & Style ) -> CargoResult < ( ) > {
467
440
match * self {
468
- ShellOut :: Stream {
469
- ref mut buffered_stdout,
470
- ..
471
- } => {
472
- let mut buffer = buffered_stdout. buffer ( ) ;
473
- buffer. reset ( ) ?;
474
- buffer. set_color ( & to_termcolor_spec ( * color) ) ?;
475
- write ! ( buffer, "{}" , fragment) ?;
476
- buffer. reset ( ) ?;
477
- buffered_stdout. print ( & buffer) ?;
441
+ ShellOut :: Stream { ref mut stdout, .. } => {
442
+ let style = style. render ( ) ;
443
+ let reset = anstyle:: Reset . render ( ) ;
444
+
445
+ let mut buffer = Vec :: new ( ) ;
446
+ write ! ( buffer, "{style}{}{reset}" , fragment) ?;
447
+ stdout. write_all ( & buffer) ?;
478
448
}
479
449
ShellOut :: Write ( ref mut w) => {
480
450
write ! ( w, "{}" , fragment) ?;
@@ -484,18 +454,15 @@ impl ShellOut {
484
454
}
485
455
486
456
/// Write a styled fragment
487
- fn write_stderr ( & mut self , fragment : impl fmt:: Display , color : & Style ) -> CargoResult < ( ) > {
457
+ fn write_stderr ( & mut self , fragment : impl fmt:: Display , style : & Style ) -> CargoResult < ( ) > {
488
458
match * self {
489
- ShellOut :: Stream {
490
- ref mut buffered_stderr,
491
- ..
492
- } => {
493
- let mut buffer = buffered_stderr. buffer ( ) ;
494
- buffer. reset ( ) ?;
495
- buffer. set_color ( & to_termcolor_spec ( * color) ) ?;
496
- write ! ( buffer, "{}" , fragment) ?;
497
- buffer. reset ( ) ?;
498
- buffered_stderr. print ( & buffer) ?;
459
+ ShellOut :: Stream { ref mut stderr, .. } => {
460
+ let style = style. render ( ) ;
461
+ let reset = anstyle:: Reset . render ( ) ;
462
+
463
+ let mut buffer = Vec :: new ( ) ;
464
+ write ! ( buffer, "{style}{}{reset}" , fragment) ?;
465
+ stderr. write_all ( & buffer) ?;
499
466
}
500
467
ShellOut :: Write ( ref mut w) => {
501
468
write ! ( w, "{}" , fragment) ?;
@@ -523,32 +490,21 @@ impl ShellOut {
523
490
524
491
impl ColorChoice {
525
492
/// Converts our color choice to termcolor's version.
526
- fn to_termcolor_color_choice ( self , stream : Stream ) -> termcolor :: ColorChoice {
493
+ fn to_anstream_color_choice ( self ) -> anstream :: ColorChoice {
527
494
match self {
528
- ColorChoice :: Always => termcolor:: ColorChoice :: Always ,
529
- ColorChoice :: Never => termcolor:: ColorChoice :: Never ,
530
- ColorChoice :: CargoAuto => {
531
- if stream. is_terminal ( ) {
532
- termcolor:: ColorChoice :: Auto
533
- } else {
534
- termcolor:: ColorChoice :: Never
535
- }
536
- }
495
+ ColorChoice :: Always => anstream:: ColorChoice :: Always ,
496
+ ColorChoice :: Never => anstream:: ColorChoice :: Never ,
497
+ ColorChoice :: CargoAuto => anstream:: ColorChoice :: Auto ,
537
498
}
538
499
}
539
500
}
540
501
541
- enum Stream {
542
- Stdout ,
543
- Stderr ,
544
- }
545
-
546
- impl Stream {
547
- fn is_terminal ( self ) -> bool {
548
- match self {
549
- Self :: Stdout => std:: io:: stdout ( ) . is_terminal ( ) ,
550
- Self :: Stderr => std:: io:: stderr ( ) . is_terminal ( ) ,
551
- }
502
+ fn supports_color ( choice : anstream:: ColorChoice ) -> bool {
503
+ match choice {
504
+ anstream:: ColorChoice :: Always
505
+ | anstream:: ColorChoice :: AlwaysAnsi
506
+ | anstream:: ColorChoice :: Auto => true ,
507
+ anstream:: ColorChoice :: Never => false ,
552
508
}
553
509
}
554
510
0 commit comments