#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Gauge {
pub filled: usize,
pub leading: usize,
pub track: usize,
}
impl Gauge {
pub const LEADING: [&'static str; 8] = ["", "▏", "▎", "▍", "▌", "▋", "▊", "▉"];
#[must_use]
pub fn of(percent: u16, width: usize) -> Self {
let eighths = width * Self::LEADING.len() * usize::from(percent.min(100)) / 100;
let filled = eighths / Self::LEADING.len();
let leading = eighths % Self::LEADING.len();
Self { filled, leading, track: width - filled - usize::from(leading > 0) }
}
#[must_use]
pub fn width(&self) -> usize {
self.filled + usize::from(self.leading > 0) + self.track
}
#[must_use]
pub fn text(&self) -> String {
format!("{}{}{}", "█".repeat(self.filled), Self::LEADING[self.leading], " ".repeat(self.track))
}
}