Skip to content

Commit

Permalink
feat(refactor): Move all functionality from main.rs
Browse files Browse the repository at this point in the history
to lib.rs to hopefully allow for better use of
lazy_static as discussed in issue rustwasm#25
  • Loading branch information
Andy-Bell committed Apr 6, 2018
1 parent ff3566e commit b1741bb
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 69 deletions.
86 changes: 85 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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(),
Expand All @@ -38,3 +45,80 @@ pub fn create_pkg_dir(path: &str) -> Result<(), Error> {
pb.finish();
Ok(())
}

pub fn init_command(path: Option<String>, scope: std::option::Option<String>) -> 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<String>) -> 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<String>) -> 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<String>,
#[structopt(long = "scope", short = "s")]
scope: Option<String>,
},
#[structopt(name = "pack")]
/// 🍱 create a tar of your npm package but don't ublish! [NOT IMPLEMENTED]
Pack { path: Option<String> },
#[structopt(name = "publish")]
/// πŸŽ† pack up your npm package and publish! [NOT MPLEMENTED]
Publish { path: Option<String> },
}
72 changes: 4 additions & 68 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>,
#[structopt(long = "scope", short = "s")]
scope: Option<String>,
},
#[structopt(name = "pack")]
/// 🍱 create a tar of your npm package but don't publish! [NOT IMPLEMENTED]
Pack { path: Option<String> },
#[structopt(name = "publish")]
/// πŸŽ† pack up your npm package and publish! [NOT IMPLEMENTED]
Publish { path: Option<String> },
}

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)?;
}
});

0 comments on commit b1741bb

Please sign in to comment.