feat(lib): reorg manifest work into mod

master
Ashley Williams 7 years ago
parent a5a4f8b324
commit edb8e1ef72
  1. 82
      src/lib.rs
  2. 7
      src/main.rs
  3. 82
      src/manifest.rs
  4. 14
      tests/manifest.rs

@ -7,92 +7,14 @@ extern crate toml;
pub mod build;
pub mod bindgen;
pub mod readme;
pub mod manifest;
use std::fs;
use std::fs::File;
use std::io::prelude::*;
use failure::Error;
#[derive(Deserialize)]
struct CargoManifest {
package: CargoPackage,
}
#[derive(Deserialize)]
struct CargoPackage {
name: String,
description: String,
version: String,
license: String,
repository: String,
}
#[derive(Serialize)]
struct NpmPackage {
name: String,
description: String,
version: String,
license: String,
repository: Repository,
files: Vec<String>,
}
#[derive(Serialize)]
struct Repository {
#[serde(rename = "type")]
ty: String,
url: String,
}
fn read_cargo_toml(path: &str) -> Result<CargoManifest, Error> {
let path_to_manifest = format!("{}/Cargo.toml", path);
println!("👩🍳 reading {}", path_to_manifest);
let mut cargo_file = File::open(path_to_manifest)?;
let mut cargo_contents = String::new();
cargo_file.read_to_string(&mut cargo_contents)?;
Ok(toml::from_str(&cargo_contents)?)
}
impl CargoManifest {
fn into_npm(self) -> NpmPackage {
let filename = self.package.name.replace("-", "_");
let js_file = format!("{}.js", filename);
let wasm_file = format!("{}_bg.wasm", filename);
NpmPackage {
name: self.package.name,
description: self.package.description,
version: self.package.version,
license: self.package.license,
repository: Repository {
ty: "git".to_string(),
url: self.package.repository,
},
files: vec![js_file, wasm_file],
}
}
}
fn create_pkg_dir(path: &str) -> Result<(), Error> {
pub fn create_pkg_dir(path: &str) -> Result<(), Error> {
let path_to_pkg_dir = format!("{}/pkg", path);
fs::create_dir_all(path_to_pkg_dir)?;
Ok(())
}
/// Generate a package.json file inside in `./pkg`.
pub fn write_package_json(path: &str) -> Result<(), Error> {
create_pkg_dir(path)?;
let path_to_pkg_file = format!("{}/pkg/package.json", path);
let mut pkg_file = File::create(path_to_pkg_file)?;
let crate_data = read_cargo_toml(path)?;
let npm_data = crate_data.into_npm();
let npm_json = serde_json::to_string(&npm_data)?;
pkg_file.write_all(npm_json.as_bytes())?;
println!("✍ wrote a package.json!");
Ok(())
}
pub fn get_crate_name(path: &str) -> Result<String, Error> {
Ok(read_cargo_toml(path)?.package.name)
}

@ -3,7 +3,7 @@ extern crate failure;
extern crate quicli;
extern crate wasm_pack;
use wasm_pack::{build, bindgen, readme};
use wasm_pack::{bindgen, build, manifest, readme};
use quicli::prelude::*;
@ -38,10 +38,11 @@ main!(|args: Cli, log_level: verbosity| match args.cmd {
};
build::rustup_add_wasm_target();
build::cargo_build_wasm(&crate_path);
wasm_pack::write_package_json(&crate_path)?;
wasm_pack::create_pkg_dir(&crate_path)?;
manifest::write_package_json(&crate_path)?;
readme::copy_from_crate(&crate_path)?;
bindgen::cargo_install_wasm_bindgen();
let name = wasm_pack::get_crate_name(&crate_path)?;
let name = manifest::get_crate_name(&crate_path)?;
bindgen::wasm_bindgen_build(&crate_path, &name);
}
Command::Pack { .. } => {

@ -0,0 +1,82 @@
use std::fs::File;
use std::io::prelude::*;
use failure::Error;
use serde_json;
use toml;
#[derive(Deserialize)]
struct CargoManifest {
package: CargoPackage,
}
#[derive(Deserialize)]
struct CargoPackage {
name: String,
description: String,
version: String,
license: String,
repository: String,
}
#[derive(Serialize)]
struct NpmPackage {
name: String,
description: String,
version: String,
license: String,
repository: Repository,
files: Vec<String>,
}
#[derive(Serialize)]
struct Repository {
#[serde(rename = "type")]
ty: String,
url: String,
}
fn read_cargo_toml(path: &str) -> Result<CargoManifest, Error> {
let path_to_manifest = format!("{}/Cargo.toml", path);
println!("👩<200d>🍳 reading {}", path_to_manifest);
let mut cargo_file = File::open(path_to_manifest)?;
let mut cargo_contents = String::new();
cargo_file.read_to_string(&mut cargo_contents)?;
Ok(toml::from_str(&cargo_contents)?)
}
impl CargoManifest {
fn into_npm(self) -> NpmPackage {
let filename = self.package.name.replace("-", "_");
let js_file = format!("{}.js", filename);
let wasm_file = format!("{}_bg.wasm", filename);
NpmPackage {
name: self.package.name,
description: self.package.description,
version: self.package.version,
license: self.package.license,
repository: Repository {
ty: "git".to_string(),
url: self.package.repository,
},
files: vec![js_file, wasm_file],
}
}
}
/// Generate a package.json file inside in `./pkg`.
pub fn write_package_json(path: &str) -> Result<(), Error> {
let path_to_pkg_file = format!("{}/pkg/package.json", path);
let mut pkg_file = File::create(path_to_pkg_file)?;
let crate_data = read_cargo_toml(path)?;
let npm_data = crate_data.into_npm();
let npm_json = serde_json::to_string(&npm_data)?;
pkg_file.write_all(npm_json.as_bytes())?;
println!("✍ wrote a package.json!");
Ok(())
}
pub fn get_crate_name(path: &str) -> Result<String, Error> {
Ok(read_cargo_toml(path)?.package.name)
}

@ -1,30 +1,32 @@
extern crate dir_diff;
extern crate wasm_pack;
use wasm_pack::manifest;
#[test]
fn it_gets_the_crate_name_default_path() {
assert!(wasm_pack::get_crate_name(".").is_ok());
assert_eq!(wasm_pack::get_crate_name(".").unwrap(), "wasm-pack");
assert!(manifest::get_crate_name(".").is_ok());
assert_eq!(manifest::get_crate_name(".").unwrap(), "wasm-pack");
}
#[test]
fn it_gets_the_crate_name_provided_path() {
assert!(wasm_pack::get_crate_name("./examples/js-hello-world").is_ok());
assert!(manifest::get_crate_name("./examples/js-hello-world").is_ok());
assert_eq!(
wasm_pack::get_crate_name("./examples/js-hello-world").unwrap(),
manifest::get_crate_name("./examples/js-hello-world").unwrap(),
"js-hello-world"
);
}
#[test]
fn it_creates_a_package_json_default_path() {
assert!(wasm_pack::write_package_json(".").is_ok());
assert!(manifest::write_package_json(".").is_ok());
assert!(!dir_diff::is_different("./pkg", "./test/fixtures/package-json").unwrap());
}
#[test]
fn it_creates_a_package_json_provided_path() {
assert!(wasm_pack::write_package_json("./examples/js-hello-world").is_ok());
assert!(manifest::write_package_json("./examples/js-hello-world").is_ok());
assert!(!dir_diff::is_different(
"./examples/js-hello-world/pkg",
"./test/fixtures/package-json"
Loading…
Cancel
Save