use crate::progress::{ProgressColumn, Task};
use crate::status::spinner::Spinner;
use crate::style::Style;
use crate::text::Text;
#[derive(Debug, Clone)]
pub struct SpinnerColumn {
pub spinner_name: String,
pub style: Option<Style>,
pub finished_text: Text,
}
impl SpinnerColumn {
pub fn new(name: &str) -> Self {
SpinnerColumn {
spinner_name: name.to_string(),
style: None,
finished_text: Text::styled("\u{2714}", "green"),
}
}
#[must_use]
pub fn with_style(mut self, style: Style) -> Self {
self.style = Some(style);
self
}
#[must_use]
pub fn with_finished_text(mut self, text: Text) -> Self {
self.finished_text = text;
self
}
}
impl Default for SpinnerColumn {
fn default() -> Self {
Self::new("dots")
}
}
impl ProgressColumn for SpinnerColumn {
fn render(&self, task: &Task) -> Text {
if task.finished() {
return self.finished_text.clone();
}
let mut spinner = match Spinner::new(&self.spinner_name) {
Ok(s) => s,
Err(_) => return Text::new("?", Style::null()),
};
if let Some(ref style) = self.style {
spinner = spinner.with_style(style.clone());
}
let elapsed = task.elapsed().unwrap_or(0.0);
spinner.render(elapsed)
}
fn max_refresh(&self) -> Option<f64> {
Some(0.08)
}
}