diff --git a/src/command/build.rs b/src/command/build.rs index c9ebf59..0d649e8 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -64,12 +64,15 @@ pub struct BuildOptions { // build_config: Option, } -impl From for Build { - fn from(build_opts: BuildOptions) -> Self { +type BuildStep = fn(&mut Build, &Step, &Logger) -> Result<(), Error>; + +impl Build { + /// Construct a build command from the given options. + pub fn try_from_opts(build_opts: BuildOptions) -> Result { let crate_path = set_crate_path(build_opts.path); - let crate_name = manifest::get_crate_name(&crate_path).unwrap(); + let crate_name = manifest::get_crate_name(&crate_path)?; // let build_config = manifest::xxx(&crate_path).xxx(); - Build { + Ok(Build { crate_path, scope: build_opts.scope, disable_dts: build_opts.disable_dts, @@ -77,13 +80,9 @@ impl From for Build { debug: build_opts.debug, // build_config, crate_name, - } + }) } -} - -type BuildStep = fn(&mut Build, &Step, &Logger) -> Result<(), Error>; -impl Build { /// Execute this `Build` command. pub fn run(&mut self, log: &Logger, mode: &BuildMode) -> Result<(), Error> { let process_steps = Build::get_process_steps(mode); diff --git a/src/command/mod.rs b/src/command/mod.rs index 9b20672..fe001fa 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -84,7 +84,7 @@ pub fn run_wasm_pack(command: Command, log: &Logger) -> result::Result<(), Error "normal" => BuildMode::Normal, _ => BuildMode::Normal, }; - Build::from(build_opts).run(&log, &build_mode) + Build::try_from_opts(build_opts).and_then(|mut b| b.run(&log, &build_mode)) } Command::Pack { path } => { info!(&log, "Running pack command..."); diff --git a/src/logger.rs b/src/logger.rs index d100ccf..0f272a9 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -11,7 +11,10 @@ use std::path::PathBuf; /// Create the logger for wasm-pack that will output any info warning or errors we encounter pub fn new(cmd: &Command, verbosity: u8) -> Result { let log_path = log_file_path(&cmd); - let file = OpenOptions::new().create(true).append(true).open(log_path)?; + let file = OpenOptions::new() + .create(true) + .append(true) + .open(log_path)?; let decorator = PlainDecorator::new(file); let drain = FullFormat::new(decorator).build().fuse(); diff --git a/src/manifest.rs b/src/manifest.rs index 2cc3919..81d464f 100644 --- a/src/manifest.rs +++ b/src/manifest.rs @@ -68,6 +68,12 @@ struct Repository { fn read_cargo_toml(path: &Path) -> Result { let manifest_path = path.join("Cargo.toml"); + if !manifest_path.is_file() { + return Error::crate_config(&format!( + "Crate directory is missing a `Cargo.toml` file; is `{}` the wrong directory?", + path.display() + )).map(|_| unreachable!()); + } let mut cargo_file = File::open(manifest_path)?; let mut cargo_contents = String::new(); cargo_file.read_to_string(&mut cargo_contents)?; diff --git a/tests/all/build.rs b/tests/all/build.rs new file mode 100644 index 0000000..ea821b5 --- /dev/null +++ b/tests/all/build.rs @@ -0,0 +1,21 @@ +use structopt::StructOpt; +use utils; +use wasm_pack::{command, logger, Cli}; + +#[test] +fn build_in_non_crate_directory_doesnt_panic() { + let fixture = utils::fixture::fixture("tests/fixtures/not-a-crate"); + let cli = Cli::from_iter_safe(vec![ + "wasm-pack", + "build", + &fixture.path.display().to_string(), + ]).unwrap(); + let logger = logger::new(&cli.cmd, cli.verbosity).unwrap(); + let result = command::run_wasm_pack(cli.cmd, &logger); + assert!( + result.is_err(), + "running wasm-pack in a non-crate directory should fail, but it should not panic" + ); + let err_msg = result.unwrap_err().to_string(); + assert!(err_msg.contains("missing a `Cargo.toml`")); +} diff --git a/tests/all/main.rs b/tests/all/main.rs index 998588e..57f8885 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -3,9 +3,11 @@ extern crate failure; #[macro_use] extern crate serde_derive; extern crate serde_json; +extern crate structopt; extern crate tempfile; extern crate wasm_pack; +mod build; mod manifest; mod readme; mod utils; diff --git a/tests/fixtures/not-a-crate/README.md b/tests/fixtures/not-a-crate/README.md new file mode 100644 index 0000000..ea36f59 --- /dev/null +++ b/tests/fixtures/not-a-crate/README.md @@ -0,0 +1 @@ +This is not a Rust crate!