#[cfg(windows)]
use std::io;
use anstream::{eprint, print};
#[cfg(windows)]
use console::Term;
use indicatif::ProgressDrawTarget;
#[cfg(windows)]
use indicatif::TermLike;
#[cfg(windows)]
#[derive(Debug)]
struct WindowsVtTerm {
inner: Term,
}
#[cfg(windows)]
impl WindowsVtTerm {
fn stderr() -> Self {
Self {
inner: Term::buffered_stderr(),
}
}
}
#[cfg(windows)]
impl TermLike for WindowsVtTerm {
fn width(&self) -> u16 {
self.inner.size().1
}
fn height(&self) -> u16 {
self.inner.size().0
}
fn move_cursor_up(&self, n: usize) -> io::Result<()> {
self.inner.move_cursor_up(n)
}
fn move_cursor_down(&self, n: usize) -> io::Result<()> {
self.inner.move_cursor_down(n)
}
fn move_cursor_right(&self, n: usize) -> io::Result<()> {
self.inner.move_cursor_right(n)
}
fn move_cursor_left(&self, n: usize) -> io::Result<()> {
self.inner.move_cursor_left(n)
}
fn write_line(&self, s: &str) -> io::Result<()> {
self.inner.write_line(s)
}
fn write_str(&self, s: &str) -> io::Result<()> {
self.inner.write_str(s)
}
fn clear_line(&self) -> io::Result<()> {
self.inner.clear_line()
}
fn flush(&self) -> io::Result<()> {
let _ = anstyle_query::windows::enable_ansi_colors();
self.inner.flush()
}
}
#[cfg(windows)]
fn progress_draw_target() -> ProgressDrawTarget {
let term = WindowsVtTerm::stderr();
if term.inner.features().colors_supported() {
ProgressDrawTarget::term_like_with_hz(Box::new(term), 20)
} else {
ProgressDrawTarget::hidden()
}
}
#[cfg(not(windows))]
fn progress_draw_target() -> ProgressDrawTarget {
ProgressDrawTarget::stderr()
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Printer {
Silent,
Quiet,
Default,
Verbose,
NoProgress,
}
impl Printer {
pub fn target(self) -> ProgressDrawTarget {
match self {
Self::Silent => ProgressDrawTarget::hidden(),
Self::Quiet => ProgressDrawTarget::hidden(),
Self::Default => progress_draw_target(),
Self::Verbose => ProgressDrawTarget::hidden(),
Self::NoProgress => ProgressDrawTarget::hidden(),
}
}
pub(crate) fn stdout_important(self) -> Stdout {
match self {
Self::Silent => Stdout::Disabled,
Self::Quiet => Stdout::Enabled,
Self::Default => Stdout::Enabled,
Self::Verbose => Stdout::Enabled,
Self::NoProgress => Stdout::Enabled,
}
}
pub(crate) fn stdout(self) -> Stdout {
match self {
Self::Silent => Stdout::Disabled,
Self::Quiet => Stdout::Disabled,
Self::Default => Stdout::Enabled,
Self::Verbose => Stdout::Enabled,
Self::NoProgress => Stdout::Enabled,
}
}
pub(crate) fn stderr(self) -> Stderr {
match self {
Self::Silent => Stderr::Disabled,
Self::Quiet => Stderr::Disabled,
Self::Default => Stderr::Enabled,
Self::Verbose => Stderr::Enabled,
Self::NoProgress => Stderr::Enabled,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Stdout {
Enabled,
Disabled,
}
impl std::fmt::Write for Stdout {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
match self {
Self::Enabled => {
#[allow(clippy::print_stdout, clippy::ignored_unit_patterns)]
{
print!("{s}");
}
}
Self::Disabled => {}
}
Ok(())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Stderr {
Enabled,
Disabled,
}
impl std::fmt::Write for Stderr {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
match self {
Self::Enabled => {
#[allow(clippy::print_stderr, clippy::ignored_unit_patterns)]
{
eprint!("{s}");
}
}
Self::Disabled => {}
}
Ok(())
}
}