1use std::io::{Result, Write};
2
3use termcolor::{Buffer, BufferWriter, ColorSpec, WriteColor};
4
5pub struct Buffers<'a> {
6 pub writer: &'a BufferWriter,
7 buffers: Vec<Buffer>,
8 current_buffer: Option<Buffer>,
9}
10
11impl<'a> Buffers<'a> {
12 pub fn new(writer: &'a BufferWriter) -> Self {
13 Buffers {
14 writer,
15 buffers: Vec::new(),
16 current_buffer: None,
17 }
18 }
19
20 pub fn push(&mut self, buffer: Buffer) -> Result<()> {
21 if let Some(mut current_buffer) = self.current_buffer.take() {
22 current_buffer.reset()?;
23 self.buffers.push(current_buffer);
24 }
25
26 self.buffers.push(buffer);
27
28 Ok(())
29 }
30
31 pub fn append(&mut self, other: &mut Vec<Buffer>) -> Result<()> {
32 if let Some(mut current_buffer) = self.current_buffer.take() {
33 current_buffer.reset()?;
34 self.buffers.push(current_buffer);
35 }
36
37 self.buffers.append(other);
38
39 Ok(())
40 }
41
42 pub fn into_vec(self) -> Result<Vec<Buffer>> {
43 let mut buffers = self.buffers;
44
45 if let Some(mut buffer) = self.current_buffer {
46 buffer.reset()?;
47 buffers.push(buffer);
48 }
49
50 Ok(buffers)
51 }
52}
53
54impl Write for Buffers<'_> {
55 fn write(&mut self, buf: &[u8]) -> Result<usize> {
56 if let Some(ref mut current_buffer) = self.current_buffer {
57 current_buffer.write(buf)
58 } else {
59 let mut new_buffer = self.writer.buffer();
60 let num_bytes = new_buffer.write(buf)?;
61 self.current_buffer = Some(new_buffer);
62
63 Ok(num_bytes)
64 }
65 }
66
67 fn flush(&mut self) -> std::io::Result<()> {
68 if let Some(ref mut current_buffer) = self.current_buffer {
69 current_buffer.flush()
70 } else {
71 Ok(())
72 }
73 }
74}
75
76impl WriteColor for Buffers<'_> {
77 fn supports_color(&self) -> bool {
78 match self.current_buffer {
79 Some(ref buffer) => buffer.supports_color(),
80 None => self.writer.buffer().supports_color(),
81 }
82 }
83
84 fn set_color(&mut self, color: &ColorSpec) -> Result<()> {
85 if let Some(ref mut current_buffer) = self.current_buffer {
86 current_buffer.set_color(color)
87 } else {
88 let mut new_buffer = self.writer.buffer();
89 new_buffer.set_color(color)?;
90 self.current_buffer = Some(new_buffer);
91
92 Ok(())
93 }
94 }
95
96 fn reset(&mut self) -> Result<()> {
97 if let Some(ref mut current_buffer) = self.current_buffer {
98 current_buffer.reset()
99 } else {
100 Ok(())
101 }
102 }
103
104 fn is_synchronous(&self) -> bool {
105 if let Some(ref buffer) = self.current_buffer {
106 buffer.is_synchronous()
107 } else {
108 self.writer.buffer().is_synchronous()
109 }
110 }
111}