rinf_cli 8.10.0

Rust for native business logic, Flutter for flexible and beautiful GUI
Documentation
use crate::dimmedln;
use crate::tool::{CaptureError, SetupError};
use std::path::Path;
use std::process::Command;

pub fn build_webassembly(
  root_dir: &Path,
  is_release_mode: bool,
  is_internet_connected: bool,
) -> Result<(), SetupError> {
  let total_steps = 3;
  let mut step = 0;

  step += 1;
  if is_internet_connected {
    dimmedln!(
      "[{}/{}] Installing Rust toolchain for the web",
      step,
      total_steps
    );
    install_wasm_toolchain()?;
  } else {
    dimmedln!(
      "[{}/{}] Skipping ensurement of Rust toolchain for the web",
      step,
      total_steps
    );
  }

  step += 1;
  dimmedln!(
    "[{}/{}] Preparing WebAssembly output path",
    step,
    total_steps
  );

  step += 1;
  dimmedln!(
    "[{}/{}] Compiling Rust with `wasm-pack` to `web` target",
    step,
    total_steps
  );
  compile_wasm(root_dir, is_release_mode)?;

  Ok(())
}

fn install_wasm_toolchain() -> Result<(), SetupError> {
  Command::new("rustup")
    .args(["toolchain", "install", "nightly"])
    .output()?
    .capture_err()?;
  Command::new("rustup")
    .args(["+nightly", "component", "add", "rust-src"])
    .output()?
    .capture_err()?;
  Command::new("rustup")
    .args(["+nightly", "target", "add", "wasm32-unknown-unknown"])
    .output()?
    .capture_err()?;
  Command::new("rustup")
    .args(["target", "add", "wasm32-unknown-unknown"])
    .output()?
    .capture_err()?;
  Command::new("cargo")
    .args(["install", "wasm-pack"])
    .output()?
    .capture_err()?;
  Command::new("cargo")
    .args(["install", "wasm-bindgen-cli"])
    .output()?
    .capture_err()?;
  Ok(())
}

fn compile_wasm(
  root_dir: &Path,
  is_release_mode: bool,
) -> Result<(), SetupError> {
  let out_path = root_dir.join("web").join("pkg");
  let out_string = out_path
    .to_str()
    .ok_or_else(|| SetupError::BadFilePath(out_path.clone()))?;
  let mut wasm_pack_args = vec![
    "--quiet",
    "build",
    "native/hub",
    "--out-dir",
    out_string,
    "--out-name",
    "hub",
    "--no-typescript",
    "--target",
    "web",
    "--",
    "-Zbuild-std=std,panic_abort",
  ];
  if !is_release_mode {
    wasm_pack_args.insert(7, "--dev");
  }

  Command::new("wasm-pack")
    .args(&wasm_pack_args)
    .env("RUSTUP_TOOLCHAIN", "nightly")
    .env(
      "RUSTFLAGS",
      concat!(
        "-C target-feature=+atomics,+bulk-memory,+mutable-globals ",
        "-C link-arg=--shared-memory ",
        "-C link-arg=--max-memory=1073741824 ",
        "-C link-arg=--import-memory ",
        "-C link-arg=--export=__wasm_init_tls ",
        "-C link-arg=--export=__tls_size ",
        "-C link-arg=--export=__tls_align ",
        "-C link-arg=--export=__tls_base",
      ),
    )
    .output()?
    .capture_err()?;

  Ok(())
}