From b1741bb98240a84d91bd426ac69ecf3e92b404e7 Mon Sep 17 00:00:00 2001 From: Andy Bell Date: Fri, 6 Apr 2018 10:20:34 +0100 Subject: [PATCH] feat(refactor): Move all functionality from main.rs to lib.rs to hopefully allow for better use of lazy_static as discussed in issue #25 --- src/lib.rs | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++- src/main.rs | 72 +++----------------------------------------- 2 files changed, 89 insertions(+), 69 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2330b029..0bbb1ea3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ extern crate failure; extern crate indicatif; #[macro_use] extern crate lazy_static; +extern crate quicli; #[macro_use] extern crate serde_derive; extern crate serde_json; @@ -16,17 +17,23 @@ pub mod npm; pub mod progressbar; pub mod readme; +use quicli::prelude::*; use std::fs; +use std::time::Instant; use console::style; use failure::Error; +use indicatif::HumanDuration; use progressbar::ProgressOutput; lazy_static! { pub static ref PBAR: ProgressOutput = { ProgressOutput::new() }; } -pub fn create_pkg_dir(path: &str) -> Result<(), Error> { +// quicli::prelude::* imports a different result struct which gets +// precedence over the std::result::Result, so have had to specify +// the correct type here. +pub fn create_pkg_dir(path: &str) -> std::result::Result<(), Error> { let step = format!( "{} {}Creating a pkg directory...", style("[3/7]").bold().dim(), @@ -38,3 +45,80 @@ pub fn create_pkg_dir(path: &str) -> Result<(), Error> { pb.finish(); Ok(()) } + +pub fn init_command(path: Option, scope: std::option::Option) -> std::result::Result<(), Error> { + let started = Instant::now(); + + let crate_path = match path { + Some(p) => p, + None => ".".to_string(), + }; + + build::rustup_add_wasm_target(); + build::cargo_build_wasm(&crate_path); + create_pkg_dir(&crate_path)?; + manifest::write_package_json(&crate_path, scope)?; + readme::copy_from_crate(&crate_path)?; + bindgen::cargo_install_wasm_bindgen(); + let name = manifest::get_crate_name(&crate_path)?; + bindgen::wasm_bindgen_build(&crate_path, &name); + PBAR.one_off_message(&format!( + "{} Done in {}", + emoji::SPARKLE, + HumanDuration(started.elapsed()) + )); + PBAR.one_off_message(&format!( + "{} Your WASM pkg is ready to publish at {}/pkg", + emoji::PACKAGE, + &crate_path + )); + PBAR.done()?; + Ok(()) +} + +pub fn pack_command(path: Option) -> std::result::Result<(),Error> { + let crate_path = match path { + Some(p) => p, + None => ".".to_string(), + }; + npm::npm_pack(&crate_path); + println!("🎒 packed up your package!"); + Ok(()) +} + +pub fn publish_command(path: Option) -> std::result::Result<(), Error> { + let crate_path = match path { + Some(p) => p, + None => ".".to_string(), + }; + npm::npm_publish(&crate_path); + println!("💥 published your package!"); + Ok(()) +} + +/// 📦 ✨ pack and publish your wasm! +#[derive(Debug, StructOpt)] +pub struct Cli { + #[structopt(subcommand)] // Note that we mark a field as a subcommand + pub cmd: Command, + /// log all the things + #[structopt(long = "verbose", short = "v", parse(from_occurrences))] + pub verbosity: u8, +} + +#[derive(Debug, StructOpt)] +pub enum Command { + #[structopt(name = "init")] + /// 🐣 initialize a package.json based on your cmpiled wasm + Init { + path: Option, + #[structopt(long = "scope", short = "s")] + scope: Option, + }, + #[structopt(name = "pack")] + /// 🍱 create a tar of your npm package but don't ublish! [NOT IMPLEMENTED] + Pack { path: Option }, + #[structopt(name = "publish")] + /// 🎆 pack up your npm package and publish! [NOT MPLEMENTED] + Publish { path: Option }, +} diff --git a/src/main.rs b/src/main.rs index bf56f927..07ba643d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,82 +4,18 @@ extern crate indicatif; #[macro_use] extern crate quicli; -use std::time::Instant; - -use indicatif::HumanDuration; use quicli::prelude::*; -use wasm_pack::{bindgen, build, emoji, manifest, npm, readme, PBAR}; - -/// 📦 ✨ pack and publish your wasm! -#[derive(Debug, StructOpt)] -struct Cli { - #[structopt(subcommand)] // Note that we mark a field as a subcommand - cmd: Command, - /// 📝 log all the things! - #[structopt(long = "verbose", short = "v", parse(from_occurrences))] - verbosity: u8, -} +use wasm_pack::{Cli, Command, init_command, pack_command, publish_command}; -#[derive(Debug, StructOpt)] -enum Command { - #[structopt(name = "init")] - /// 🐣 initialize a package.json based on your compiled wasm - Init { - path: Option, - #[structopt(long = "scope", short = "s")] - scope: Option, - }, - #[structopt(name = "pack")] - /// 🍱 create a tar of your npm package but don't publish! [NOT IMPLEMENTED] - Pack { path: Option }, - #[structopt(name = "publish")] - /// 🎆 pack up your npm package and publish! [NOT IMPLEMENTED] - Publish { path: Option }, -} main!(|args: Cli, log_level: verbosity| match args.cmd { Command::Init { path, scope } => { - let started = Instant::now(); - - let crate_path = match path { - Some(p) => p, - None => ".".to_string(), - }; - - build::rustup_add_wasm_target(); - build::cargo_build_wasm(&crate_path); - wasm_pack::create_pkg_dir(&crate_path)?; - manifest::write_package_json(&crate_path, scope)?; - readme::copy_from_crate(&crate_path)?; - bindgen::cargo_install_wasm_bindgen(); - let name = manifest::get_crate_name(&crate_path)?; - bindgen::wasm_bindgen_build(&crate_path, &name); - PBAR.one_off_message(&format!( - "{} Done in {}", - emoji::SPARKLE, - HumanDuration(started.elapsed()) - )); - PBAR.one_off_message(&format!( - "{} Your WASM pkg is ready to publish at {}/pkg", - emoji::PACKAGE, - &crate_path - )); - PBAR.done()?; + init_command(path, scope)?; } Command::Pack { path } => { - let crate_path = match path { - Some(p) => p, - None => ".".to_string(), - }; - npm::npm_pack(&crate_path); - println!("🎒 packed up your package!"); + pack_command(path)?; } Command::Publish { path } => { - let crate_path = match path { - Some(p) => p, - None => ".".to_string(), - }; - npm::npm_publish(&crate_path); - println!("💥 published your package!"); + publish_command(path)?; } });