multiversx_sc_meta_lib/tools/
wasm_opt.rs1use 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 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}