use async_trait::async_trait;
use rspack_error::Result;
use crate::{Compilation, cache::Cache, logger::Logger};
#[async_trait]
pub trait PassExt: Send + Sync {
fn name(&self) -> &'static str;
async fn run_pass(&self, compilation: &mut Compilation) -> Result<()>;
async fn run_pass_with_cache(
&self,
compilation: &mut Compilation,
_cache: &mut dyn Cache,
) -> Result<()> {
self.run_pass(compilation).await
}
async fn before_pass(&self, _compilation: &mut Compilation, _cache: &mut dyn Cache) {}
async fn after_pass(&self, _compilation: &mut Compilation, _cache: &mut dyn Cache) {}
fn is_enabled(&self, _compilation: &Compilation) -> bool {
true
}
async fn run(&self, compilation: &mut Compilation, cache: &mut dyn Cache) -> Result<()> {
if !self.is_enabled(compilation) {
return Ok(());
}
let logger = compilation.get_logger("rspack.Compilation");
let start = logger.time(self.name());
self.before_pass(compilation, cache).await;
let result = self.run_pass_with_cache(compilation, cache).await;
if result.is_ok() {
self.after_pass(compilation, cache).await;
}
logger.time_end(start);
result
}
}