use crate::infra::{CommandExecutor, FileSystem, RealCommandExecutor, RealFileSystem};
use std::path::Path;
use crate::tools::ToolChain;
use super::build_orchestrator::BuildOrchestrator;
use super::config::PipelineConfig;
use super::error::PipelineError;
use super::metrics::SizeMetrics;
pub struct BuildPipeline<FS: FileSystem = RealFileSystem, CE: CommandExecutor = RealCommandExecutor>
{
orchestrator: BuildOrchestrator<FS, CE>,
}
impl BuildPipeline {
pub fn new(project_root: impl AsRef<Path>, config: PipelineConfig) -> Self {
Self::with_executors(project_root, config, RealFileSystem, RealCommandExecutor)
}
}
impl<FS: FileSystem + Clone, CE: CommandExecutor + Clone> BuildPipeline<FS, CE> {
pub fn with_executors(
project_root: impl AsRef<Path>,
config: PipelineConfig,
fs: FS,
cmd_executor: CE,
) -> Self {
let orchestrator = BuildOrchestrator::new(
project_root.as_ref().to_path_buf(),
config,
ToolChain::with_executor(cmd_executor.clone()),
fs,
cmd_executor,
);
Self { orchestrator }
}
#[must_use = "Build results contain important size metrics"]
pub fn build(&self) -> Result<SizeMetrics, PipelineError> {
self.orchestrator.execute()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::pipeline::config::{BindgenTarget, WasmOptLevel, WasmTarget};
#[test]
fn test_new_pipeline_creates_orchestrator() {
let config = PipelineConfig::default();
let _pipeline = BuildPipeline::new("/test/project", config);
}
#[test]
fn test_new_pipeline_with_custom_config() {
let config = PipelineConfig {
target: WasmTarget::Wasm32Wasi,
opt_level: WasmOptLevel::O3,
..Default::default()
};
let _pipeline = BuildPipeline::new("/test/project", config.clone());
}
#[test]
fn test_pipeline_with_custom_bindgen_target() {
let config = PipelineConfig {
bindgen_target: BindgenTarget::NodeJs,
..Default::default()
};
let _pipeline = BuildPipeline::new("/test/project", config);
}
#[test]
fn test_pipeline_with_wasm_snip_enabled() {
let config = PipelineConfig {
run_wasm_snip: true,
..Default::default()
};
let _pipeline = BuildPipeline::new("/test/project", config);
}
#[test]
fn test_pipeline_with_wasm_snip_disabled() {
let config = PipelineConfig {
run_wasm_snip: false,
..Default::default()
};
let _pipeline = BuildPipeline::new("/test/project", config);
}
#[test]
fn test_pipeline_default_target_is_wasm32_unknown_unknown() {
let config = PipelineConfig::default();
assert_eq!(config.target.as_str(), "wasm32-unknown-unknown");
let _pipeline = BuildPipeline::new("/test/project", config);
}
#[test]
fn test_pipeline_default_opt_level_is_oz() {
let config = PipelineConfig::default();
assert_eq!(config.opt_level, WasmOptLevel::Oz);
let _pipeline = BuildPipeline::new("/test/project", config);
}
#[test]
fn test_pipeline_default_bindgen_target_is_web() {
let config = PipelineConfig::default();
assert_eq!(config.bindgen_target.as_str(), "web");
let _pipeline = BuildPipeline::new("/test/project", config);
}
}