cli_table/
buffers.rs

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}