#![crate_name = "progress"]
#![crate_type = "rlib"]
#![crate_type = "dylib"]
use std::io::{self, Write};
extern crate terminal_size;
use terminal_size::{terminal_size, Width};
pub struct BarBuilder {
_left_cap: Option<String>,
_right_cap: Option<String>,
_filled_symbol: Option<String>,
_empty_symbol: Option<String>,
}
impl BarBuilder {
pub fn new() -> BarBuilder {
BarBuilder {
_left_cap: None,
_right_cap: None,
_filled_symbol: None,
_empty_symbol: None,
}
}
pub fn left_cap(&mut self, symbol: &str) -> &mut BarBuilder {
self._left_cap = Some(symbol.to_string());
self
}
pub fn right_cap(&mut self, symbol: &str) -> &mut BarBuilder {
self._right_cap = Some(symbol.to_string());
self
}
pub fn filled_symbol(&mut self, symbol: &str) -> &mut BarBuilder {
self._filled_symbol = Some(symbol.to_string());
self
}
pub fn empty_symbol(&mut self, symbol: &str) -> &mut BarBuilder {
self._empty_symbol = Some(symbol.to_string());
self
}
pub fn build(&mut self) -> Bar {
Bar {
_job_title: String::new(),
_progress_percentage: 0,
_left_cap: self._left_cap.take().unwrap_or(String::from("[")),
_right_cap: self._right_cap.take().unwrap_or(String::from("]")),
_filled_symbol: self._filled_symbol.take().unwrap_or(String::from("=")),
_empty_symbol: self._empty_symbol.take().unwrap_or(String::from("-")),
}
}
}
pub struct Bar {
_job_title: String,
_progress_percentage: i32,
_left_cap: String,
_right_cap: String,
_filled_symbol: String,
_empty_symbol: String,
}
impl Bar {
pub fn new() -> Bar {
Bar {
_job_title: String::new(),
_progress_percentage: 0,
_left_cap: String::from("["),
_right_cap: String::from("]"),
_filled_symbol: String::from("="),
_empty_symbol: String::from("-"),
}
}
pub fn jobs_done(&mut self) {
self._job_title.clear();
self._progress_percentage = 0;
print!("\n");
}
pub fn set_job_title(&mut self, new_title: &str) {
self._job_title.clear();
self._job_title.push_str(new_title);
self._show_progress();
}
pub fn reach_percent(&mut self, percent: i32) {
self._progress_percentage = percent;
self._show_progress();
}
pub fn add_percent(&mut self, progress: i32) {
self._progress_percentage += progress;
self._show_progress();
}
}
impl Bar {
fn _show_progress(&self) {
let width = if let Some((Width(w), _)) = terminal_size() {
w as i32
} else {
81 as i32
};
let overhead = self._progress_percentage / 100;
let left_percentage = self._progress_percentage - overhead * 100;
let bar_len = width - (50 + 5) - 2;
let bar_finished_len = ((bar_len as f32) *
(left_percentage as f32 / 100.0)) as i32;
let filled_symbol = if overhead & 0b1 == 0 {
&self._filled_symbol
} else {
&self._empty_symbol
};
let empty_symbol = if overhead & 0b1 == 0 {
&self._empty_symbol
} else {
&self._filled_symbol
};
io::stdout().flush().unwrap();
print!("\r");
print!("{:<50}", self._job_title);
print!("{}", self._left_cap);
for _ in 0..bar_finished_len {
print!("{}", filled_symbol);
}
for _ in bar_finished_len..bar_len {
print!("{}", empty_symbol);
}
print!("{}", self._right_cap);
print!("{:>4}%", self._progress_percentage);
}
}
pub struct Text {
_job_title: String,
}
impl Text {
pub fn new() -> Text {
Text {
_job_title: String::new(),
}
}
pub fn set_job_title(&mut self, new_title: &str) {
self._job_title.clear();
self._job_title.push_str(new_title);
self._show_progress();
}
pub fn jobs_done(&self) {
print!("\n");
}
}
impl Text {
fn _show_progress(& self) {
io::stdout().flush().unwrap();
print!("\r");
print!("{:<81}", self._job_title);
}
}
pub struct SpinningCircle {
_job_title: String,
_circle_symbols: Vec<char>,
_finished_symbol: char,
_tick_count: usize,
}
impl SpinningCircle {
pub fn new() -> SpinningCircle {
SpinningCircle {
_job_title: String::new(),
_circle_symbols: vec!['|', '/', '-', '\\'],
_finished_symbol: '*',
_tick_count: 0,
}
}
pub fn set_job_title(&mut self, new_title: &str) {
self._job_title.clear();
self._job_title.push_str(new_title);
self._show_progress();
}
pub fn tick(&mut self) {
self._tick_count += 1;
self._show_progress();
}
pub fn jobs_done(& self) {
self._show_finished();
}
}
impl SpinningCircle {
fn _print_symbol_and_texts(& self, symbol: &char) {
io::stdout().flush().unwrap();
print!("\r");
print!("{}", symbol);
print!(" {:<81}", self._job_title);
}
fn _show_progress(& self) {
let circle_symbol: &char = self._circle_symbols.get(
self._tick_count % self._circle_symbols.len()).unwrap();
self._print_symbol_and_texts(circle_symbol);
}
fn _show_finished(& self) {
self._print_symbol_and_texts(&self._finished_symbol);
print!("\n");
}
}