use crossterm::{cursor::{Hide, MoveToColumn, MoveToNextLine, MoveToPreviousLine, Show},
style::Print,
terminal::{Clear, ClearType}};
use miette::IntoDiagnostic;
use crate::{lock_output_device_as_mut, ok, queue_commands, queue_commands_no_lock,
CommonResult, LockedOutputDevice, OutputDevice, SharedWriter, SpinnerStyle};
#[allow(clippy::needless_pass_by_value)]
fn clear_lines_for_spinner(
output_device: OutputDevice,
num_lines_to_clear: u16,
) -> CommonResult<()> {
if num_lines_to_clear == 0 {
return ok!();
}
let writer = lock_output_device_as_mut!(output_device);
queue_commands_no_lock!(writer, Hide, Clear(ClearType::CurrentLine));
for _ in 1..num_lines_to_clear {
queue_commands_no_lock!(writer, MoveToNextLine(1), Clear(ClearType::CurrentLine));
}
if num_lines_to_clear > 1 {
queue_commands_no_lock!(writer, MoveToPreviousLine(num_lines_to_clear - 1));
}
queue_commands_no_lock!(writer, MoveToColumn(0));
writer.flush().into_diagnostic()?;
ok!()
}
pub fn print_start_if_standalone(
output_device: OutputDevice,
maybe_shared_writer: &Option<SharedWriter>,
) -> CommonResult<()> {
if maybe_shared_writer.is_none() {
clear_lines_for_spinner(output_device, 2)?;
}
ok!()
}
#[allow(clippy::needless_pass_by_value)]
pub fn print_tick_interval_msg(
_style: &SpinnerStyle,
output: &str,
output_device: OutputDevice,
) -> CommonResult<()> {
queue_commands!(
output_device,
MoveToColumn(0),
Clear(ClearType::CurrentLine),
Print(format!("{output}\n")),
MoveToPreviousLine(1),
MoveToColumn(0)
);
lock_output_device_as_mut!(output_device)
.flush()
.into_diagnostic()?;
ok!()
}
#[allow(clippy::needless_pass_by_value)]
pub fn print_tick_final_msg(
_style: &SpinnerStyle,
output: &str,
output_device: OutputDevice,
maybe_shared_writer: &Option<SharedWriter>,
) -> CommonResult<()> {
let writer = lock_output_device_as_mut!(output_device);
queue_commands_no_lock!(
writer,
MoveToColumn(0),
Clear(ClearType::CurrentLine),
Print(format!("{output}\n")),
Clear(ClearType::FromCursorDown)
);
if maybe_shared_writer.is_none() {
print_end_if_standalone(writer).ok();
}
writer.flush().into_diagnostic()?;
ok!()
}
#[allow(clippy::missing_errors_doc)]
fn print_end_if_standalone(writer: LockedOutputDevice<'_>) -> CommonResult<()> {
queue_commands_no_lock!(
writer,
MoveToColumn(0),
Clear(ClearType::CurrentLine),
Show
);
ok!()
}