From aa629b320cdabe46c846a4877740e5001d21a72a Mon Sep 17 00:00:00 2001 From: Michael Gattozzi Date: Tue, 20 Mar 2018 19:03:13 -0400 Subject: [PATCH] feat(pbar): Add global progress bar to write to This commit allows us to have a global progress bar to write data to giving us the following benefits: - Consistent ways to handle types of messages such as errors and warnings - Easy interface to add progress bars of various types - Easy to maintain, add new types of bars, or more while encapsulating the login in a single module --- Cargo.lock | 1 + Cargo.toml | 1 + src/bindgen.rs | 20 ++----------- src/build.rs | 6 ++-- src/lib.rs | 9 +++++- src/main.rs | 11 +++---- src/manifest.rs | 23 +++++--------- src/progressbar.rs | 74 ++++++++++++++++++++++++++++++++++++++-------- src/readme.rs | 15 ++-------- 9 files changed, 94 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e28d9b8..f38a89c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -638,6 +638,7 @@ dependencies = [ "console 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "quicli 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index ae25ad5..3cd90ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,4 @@ serde = "1.0" serde_derive = "1.0" serde_json = "1.0" toml = "0.4" +lazy_static = "1.0.0" diff --git a/src/bindgen.rs b/src/bindgen.rs index 46220fa..af8e17c 100644 --- a/src/bindgen.rs +++ b/src/bindgen.rs @@ -1,6 +1,6 @@ +use PBAR; use console::style; use emoji; -use progressbar; use std::process::Command; pub fn cargo_install_wasm_bindgen() { @@ -9,22 +9,13 @@ pub fn cargo_install_wasm_bindgen() { style("[6/7]").bold().dim(), emoji::DOWN_ARROW ); - let pb = progressbar::new(step); + let pb = PBAR.message(&step); let _output = Command::new("cargo") .arg("install") .arg("wasm-bindgen") .output() .unwrap_or_else(|e| panic!("{} failed to execute process: {}", emoji::ERROR, e)); pb.finish(); - //if !output.status.success() { - // let s = String::from_utf8_lossy(&output.stderr); - - // print!( - // "{} cargo_install_wasm_bindgen failed and stderr was:\n{}", - // emoji::ERROR, - // s - // ); - // } } pub fn wasm_bindgen_build(path: &str, name: &str) { @@ -33,7 +24,7 @@ pub fn wasm_bindgen_build(path: &str, name: &str) { style("[7/7]").bold().dim(), emoji::RUNNER ); - let pb = progressbar::new(step); + let pb = PBAR.message(&step); let binary_name = name.replace("-", "_"); let wasm_path = format!("target/wasm32-unknown-unknown/release/{}.wasm", binary_name); let _output = Command::new("wasm-bindgen") @@ -44,9 +35,4 @@ pub fn wasm_bindgen_build(path: &str, name: &str) { .output() .unwrap_or_else(|e| panic!("{} failed to execute process: {}", emoji::ERROR, e)); pb.finish(); - //if !output.status.success() { - // let s = String::from_utf8_lossy(&output.stderr); - - // print!(" wasm_bindgen_build failed and stderr was:\n{}", emoji::ERROR, s); - //} } diff --git a/src/build.rs b/src/build.rs index f3ed8a5..f6953a5 100644 --- a/src/build.rs +++ b/src/build.rs @@ -1,6 +1,6 @@ +use PBAR; use console::style; use emoji; -use progressbar; use std::process::Command; pub fn rustup_add_wasm_target() { @@ -9,7 +9,7 @@ pub fn rustup_add_wasm_target() { style("[1/7]").bold().dim(), emoji::TARGET ); - let pb = progressbar::new(step); + let pb = PBAR.message(&step); let output = Command::new("rustup") .arg("target") .arg("add") @@ -34,7 +34,7 @@ pub fn cargo_build_wasm(path: &str) { style("[2/7]").bold().dim(), emoji::CYCLONE ); - let pb = progressbar::new(step); + let pb = PBAR.message(&step); let output = Command::new("cargo") .current_dir(path) .arg("build") diff --git a/src/lib.rs b/src/lib.rs index c7d45c9..2330b02 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,8 @@ extern crate console; extern crate failure; extern crate indicatif; #[macro_use] +extern crate lazy_static; +#[macro_use] extern crate serde_derive; extern crate serde_json; extern crate toml; @@ -18,6 +20,11 @@ use std::fs; use console::style; use failure::Error; +use progressbar::ProgressOutput; + +lazy_static! { + pub static ref PBAR: ProgressOutput = { ProgressOutput::new() }; +} pub fn create_pkg_dir(path: &str) -> Result<(), Error> { let step = format!( @@ -25,7 +32,7 @@ pub fn create_pkg_dir(path: &str) -> Result<(), Error> { style("[3/7]").bold().dim(), emoji::FOLDER ); - let pb = progressbar::new(step); + let pb = PBAR.message(&step); let pkg_dir_path = format!("{}/pkg", path); fs::create_dir_all(pkg_dir_path)?; pb.finish(); diff --git a/src/main.rs b/src/main.rs index 13c2ebe..bf56f92 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use std::time::Instant; use indicatif::HumanDuration; use quicli::prelude::*; -use wasm_pack::{bindgen, build, emoji, manifest, npm, readme}; +use wasm_pack::{bindgen, build, emoji, manifest, npm, readme, PBAR}; /// 📦 ✨ pack and publish your wasm! #[derive(Debug, StructOpt)] @@ -54,16 +54,17 @@ main!(|args: Cli, log_level: verbosity| match args.cmd { bindgen::cargo_install_wasm_bindgen(); let name = manifest::get_crate_name(&crate_path)?; bindgen::wasm_bindgen_build(&crate_path, &name); - println!( + PBAR.one_off_message(&format!( "{} Done in {}", emoji::SPARKLE, HumanDuration(started.elapsed()) - ); - println!( + )); + PBAR.one_off_message(&format!( "{} Your WASM pkg is ready to publish at {}/pkg", emoji::PACKAGE, &crate_path - ) + )); + PBAR.done()?; } Command::Pack { path } => { let crate_path = match path { diff --git a/src/manifest.rs b/src/manifest.rs index 764f8de..c60583a 100644 --- a/src/manifest.rs +++ b/src/manifest.rs @@ -1,11 +1,10 @@ use std::fs::File; use std::io::prelude::*; +use PBAR; use console::style; use emoji; use failure::Error; -use indicatif::MultiProgress; -use progressbar; use serde_json; use toml; @@ -82,40 +81,32 @@ pub fn write_package_json(path: &str, scope: Option) -> Result<(), Error emoji::MEMO ); - let warn = |field| { + let warn_fmt = |field| { format!( - "{} {}: Field {} is missing from Cargo.toml. It is not necessary, but recommended", - emoji::WARN, - style("[WARN]").bold().dim(), + "Field {} is missing from Cargo.toml. It is not necessary, but recommended", field ) }; - let m = MultiProgress::new(); - let pb = m.add(progressbar::new(step)); - + let pb = PBAR.message(&step); let pkg_file_path = format!("{}/pkg/package.json", path); let mut pkg_file = File::create(pkg_file_path)?; let crate_data = read_cargo_toml(path)?; let npm_data = crate_data.into_npm(scope); if npm_data.description.is_none() { - let warn_pb = m.add(progressbar::new(warn("description"))); - warn_pb.finish(); + PBAR.warn(&warn_fmt("description")); } if npm_data.repository.is_none() { - let warn_pb = m.add(progressbar::new(warn("repository"))); - warn_pb.finish(); + PBAR.warn(&warn_fmt("repository")); } if npm_data.license.is_none() { - let warn_pb = m.add(progressbar::new(warn("license"))); - warn_pb.finish(); + PBAR.warn(&warn_fmt("license")); } let npm_json = serde_json::to_string_pretty(&npm_data)?; pkg_file.write_all(npm_json.as_bytes())?; pb.finish(); - m.join_and_clear()?; Ok(()) } diff --git a/src/progressbar.rs b/src/progressbar.rs index bb87ed6..f04b0d8 100644 --- a/src/progressbar.rs +++ b/src/progressbar.rs @@ -1,13 +1,63 @@ -use indicatif::{ProgressBar, ProgressStyle}; - -pub fn new(msg: String) -> ProgressBar { - let pb = ProgressBar::new_spinner(); - pb.enable_steady_tick(200); - pb.set_style( - ProgressStyle::default_spinner() - .tick_chars("/|\\- ") - .template("{spinner:.dim.bold} {wide_msg}"), - ); - pb.set_message(&msg); - pb +use console::style; +use emoji; +use failure::Error; +use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; + +pub struct ProgressOutput { + bar: MultiProgress, +} + +impl ProgressOutput { + pub fn new() -> Self { + Self { + bar: MultiProgress::new(), + } + } + + pub fn message(&self, message: &str) -> ProgressBar { + self.bar.add(Self::progressbar(message)) + } + + pub fn one_off_message(&self, message: &str) { + let bar = self.bar.add(Self::progressbar(message)); + bar.finish(); + } + + pub fn warn(&self, message: &str) { + let warn = format!( + "{} {}: {}", + style("[WARN]").bold().dim(), + emoji::WARN, + message + ); + let bar = self.bar.add(Self::progressbar(&warn)); + bar.finish(); + } + + pub fn error(&self, message: &str) { + let err = format!( + "{} {}: {}", + emoji::ERROR, + style("[Error]").bold().dim(), + message + ); + let bar = self.bar.add(Self::progressbar(&err)); + bar.finish(); + } + + fn progressbar(msg: &str) -> ProgressBar { + let pb = ProgressBar::new_spinner(); + pb.enable_steady_tick(200); + pb.set_style( + ProgressStyle::default_spinner() + .tick_chars("/|\\- ") + .template("{spinner:.dim.bold} {wide_msg}"), + ); + pb.set_message(&msg); + pb + } + + pub fn done(&self) -> Result<(), Error> { + self.bar.join_and_clear().map_err(|e| Error::from(e)) + } } diff --git a/src/readme.rs b/src/readme.rs index 6bde0dd..b050306 100644 --- a/src/readme.rs +++ b/src/readme.rs @@ -1,31 +1,22 @@ use console::style; use failure::Error; -use indicatif::MultiProgress; use std::fs; +use PBAR; use emoji; -use progressbar; pub fn copy_from_crate(path: &str) -> Result<(), Error> { - let m = MultiProgress::new(); let step = format!( "{} {}Copying over your README...", style("[5/7]").bold().dim(), emoji::DANCERS ); - let pb = m.add(progressbar::new(step)); + let pb = PBAR.message(&step); let crate_readme_path = format!("{}/README.md", path); let new_readme_path = format!("{}/pkg/README.md", path); if let Err(_) = fs::copy(&crate_readme_path, &new_readme_path) { - let warn = format!( - "{} {}: origin crate has no README", - emoji::WARN, - style("[WARN]").bold().dim() - ); - let warn_pb = m.add(progressbar::new(warn)); - warn_pb.finish(); + PBAR.warn("origin crate has no README"); }; pb.finish(); - m.join_and_clear()?; Ok(()) }