/// Extend `std::io::Write` with wincon styling pub trait WinconStream { /// Write colored text to the stream fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result; } impl WinconStream for &mut T { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { (**self).write_colored(fg, bg, data) } } impl WinconStream for Box { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { (**self).write_colored(fg, bg, data) } } impl WinconStream for dyn std::io::Write { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } impl WinconStream for dyn std::io::Write + Send { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } impl WinconStream for dyn std::io::Write + Send + Sync { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } impl WinconStream for std::fs::File { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } impl WinconStream for Vec { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } impl WinconStream for std::io::Stdout { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { // Ensure exclusive access self.lock().write_colored(fg, bg, data) } } impl WinconStream for std::io::Stderr { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { // Ensure exclusive access self.lock().write_colored(fg, bg, data) } } #[cfg(not(windows))] mod platform { impl super::WinconStream for std::io::StdoutLock<'_> { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } impl super::WinconStream for std::io::StderrLock<'_> { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { crate::ansi::write_colored(self, fg, bg, data) } } } #[cfg(windows)] mod platform { impl super::WinconStream for std::io::StdoutLock<'_> { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { let initial = crate::windows::stdout_initial_colors(); crate::windows::write_colored(self, fg, bg, data, initial) } } impl super::WinconStream for std::io::StderrLock<'_> { fn write_colored( &mut self, fg: Option, bg: Option, data: &[u8], ) -> std::io::Result { let initial = crate::windows::stderr_initial_colors(); crate::windows::write_colored(self, fg, bg, data, initial) } } }