use std::io::{stderr, Stderr};
use std::time::Duration;
use ffsend_api::pipe::ProgressReporter;
use pbr::{ProgressBar as Pbr, Units};
const PROGRESS_BAR_FPS_MILLIS: u64 = 200;
pub struct ProgressBar<'a> {
progress_bar: Option<Pbr<Stderr>>,
msg_progress: &'a str,
msg_finish: &'a str,
}
impl<'a> ProgressBar<'a> {
pub fn new(msg_progress: &'a str, msg_finish: &'a str) -> ProgressBar<'a> {
Self {
progress_bar: None,
msg_progress,
msg_finish,
}
}
pub fn new_upload() -> ProgressBar<'a> {
Self::new("Encrypt & Upload ", "Upload complete")
}
pub fn new_download() -> ProgressBar<'a> {
Self::new("Download & Decrypt ", "Download complete")
}
}
impl<'a> ProgressReporter for ProgressBar<'a> {
fn start(&mut self, total: u64) {
let mut progress_bar = Pbr::on(stderr(), total);
progress_bar.set_max_refresh_rate(Some(Duration::from_millis(PROGRESS_BAR_FPS_MILLIS)));
progress_bar.set_units(Units::Bytes);
progress_bar.message(self.msg_progress);
self.progress_bar = Some(progress_bar);
}
fn progress(&mut self, progress: u64) {
self.progress_bar
.as_mut()
.expect("progress bar not yet instantiated, cannot set progress")
.set(progress);
}
fn finish(&mut self) {
let progress_bar = self
.progress_bar
.as_mut()
.expect("progress bar not yet instantiated");
#[cfg(not(target_os = "windows"))]
progress_bar.finish_print(self.msg_finish);
#[cfg(target_os = "windows")]
{
progress_bar.finish_println(self.msg_finish);
eprintln!();
}
}
}