use crate::{
OptimizationPasses,
OptimizationResult,
};
use anyhow::Result;
use wasm_opt::OptimizationOptions;
use std::{
fs::metadata,
path::PathBuf,
};
pub struct WasmOptHandler {
optimization_level: OptimizationPasses,
keep_debug_symbols: bool,
}
impl WasmOptHandler {
pub fn new(
optimization_level: OptimizationPasses,
keep_debug_symbols: bool,
) -> Result<Self> {
Ok(Self {
optimization_level,
keep_debug_symbols,
})
}
pub fn optimize(
&self,
dest_wasm: &PathBuf,
contract_artifact_name: &String,
) -> Result<OptimizationResult> {
let mut dest_optimized = dest_wasm.clone();
dest_optimized.set_file_name(format!("{}-opt.wasm", contract_artifact_name));
tracing::debug!(
"Optimization level passed to wasm-opt: {}",
self.optimization_level
);
OptimizationOptions::from(self.optimization_level)
.zero_filled_memory(true)
.debug_info(self.keep_debug_symbols)
.run(dest_wasm, &dest_optimized)?;
if !dest_optimized.exists() {
return Err(anyhow::anyhow!(
"Optimization failed, optimized wasm output file `{}` not found.",
dest_optimized.display()
))
}
let original_size = metadata(dest_wasm)?.len() as f64 / 1000.0;
let optimized_size = metadata(&dest_optimized)?.len() as f64 / 1000.0;
std::fs::rename(&dest_optimized, dest_wasm)?;
Ok(OptimizationResult {
dest_wasm: dest_wasm.clone(),
original_size,
optimized_size,
})
}
}