pub(crate) mod companion;
pub(crate) mod discovery;
pub(crate) mod last_report;
pub(crate) mod manifest;
pub(crate) mod node_args;
pub(crate) mod protocol;
pub(crate) mod report;
pub(crate) mod result_cache;
pub(crate) mod run_dir;
pub(crate) mod runner_select;
pub(crate) mod scheduler;
pub(crate) mod transport;
pub(crate) mod typecheck;
pub(crate) mod verdicts;
pub(crate) mod worktree;
#[cfg(test)]
#[expect(clippy::unwrap_used, reason = "tests unwrap to keep assertions short")]
mod e2e_tests;
use std::path::PathBuf;
use std::time::Duration;
pub use fallow_engine::mutation::Operator;
pub use last_report::{last_mutation_report_path, save_last_mutation_report};
pub use report::baseline_blocked_run_error;
pub use scheduler::control::split_control_run_failure;
pub use verdicts::{MAX_VERDICT_INPUT_BYTES, apply_mutation_verdicts, validate_mutation_verdicts};
use crate::AnalysisOptions;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MutationRunScope {
Changed {
base: Option<String>,
},
All,
Paths(Vec<PathBuf>),
}
impl Default for MutationRunScope {
fn default() -> Self {
Self::Changed { base: None }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum MutationProgress {
Setup {
mutants: usize,
},
Baseline {
test_files: usize,
},
Mutants {
done: usize,
total: usize,
},
Retries {
done: usize,
total: usize,
},
Finalize,
}
pub type MutationProgressSink<'a> = &'a (dyn Fn(MutationProgress) + Sync);
#[derive(Debug, Clone, Default)]
pub struct MutationRunOptions {
pub analysis: AnalysisOptions,
pub scope: MutationRunScope,
pub operators: Option<Vec<Operator>>,
pub allow_side_effects: bool,
pub max_mutants: Option<usize>,
pub allow_dirty: bool,
pub runtime: Option<PathBuf>,
pub concurrency: Option<usize>,
pub time_budget: Option<Duration>,
pub runner_timeout: Option<Duration>,
pub runner_config: Option<PathBuf>,
pub output_paths: Vec<PathBuf>,
pub typecheck: bool,
}