multiversx_sc_meta_lib/tools/
wasm_opt.rs

1use std::process::Command;
2
3pub const WASM_OPT_NAME: &str = "wasm-opt";
4pub const WASM_OPT_VERSION_PREFIX: &str = "wasm-opt version ";
5
6pub fn wasm_opt_version() -> Option<String> {
7    let result = Command::new(WASM_OPT_NAME).args(["--version"]).output();
8
9    match result {
10        Ok(output) => {
11            let output_string = String::from_utf8(output.stdout)
12                .expect("could not parse wasm-opt version string, invalid utf-8");
13
14            Some(parse_wasm_opt_version(&output_string))
15        }
16        Err(_) => None,
17    }
18}
19
20fn parse_wasm_opt_version(output_string: &str) -> String {
21    let mut version_string = output_string
22        .trim()
23        .strip_prefix(WASM_OPT_VERSION_PREFIX)
24        .expect(
25            "could not parse wasm-opt version string, expected prefix `{WASM_OPT_VERSION_PREFIX}`",
26        );
27
28    // take substring until first space, or all if no space
29    if let Some(idx) = version_string.find(' ') {
30        version_string = &version_string[..idx];
31    }
32
33    version_string.to_owned()
34}
35
36pub fn install_wasm_opt() {
37    let cmd = Command::new("cargo")
38        .args(["install", "wasm-opt"])
39        .status()
40        .expect("failed to execute `cargo`");
41
42    assert!(cmd.success(), "failed to install wasm-opt");
43
44    println!("wasm-opt installed successfully");
45}
46
47pub fn run_wasm_opt(output_wasm_path: &str) {
48    let exit_status = Command::new(WASM_OPT_NAME)
49        .arg(output_wasm_path)
50        .arg("-Oz")
51        .arg("--enable-bulk-memory")
52        .arg("--output")
53        .arg(output_wasm_path)
54        .spawn()
55        .expect("failed to spawn wasm-opt process")
56        .wait()
57        .expect("wasm-opt was not running");
58
59    assert!(exit_status.success(), "wasm-opt process failed");
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65
66    #[test]
67    fn test_parse_wasm_opt_version_116() {
68        let version = parse_wasm_opt_version("wasm-opt version 116 (version_116)");
69        assert_eq!(version, "116");
70    }
71
72    #[test]
73    fn test_parse_wasm_opt_version_117() {
74        let version = parse_wasm_opt_version("wasm-opt version 117");
75        assert_eq!(version, "117");
76    }
77}