use super::{AdapterError, CommandSpec, ProcessRunner, RunResult};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[derive(Debug, Default, Clone)]
pub struct FakeProcessRunner {
results: Arc<Mutex<HashMap<String, RunResult>>>,
fallback: Arc<Mutex<Option<RunResult>>>,
history: Arc<Mutex<Vec<CommandSpec>>>,
}
impl FakeProcessRunner {
pub fn new() -> Self {
Self::default()
}
pub fn set_result(&self, argv: &[&str], result: RunResult) {
let key = argv.join(" ");
self.results.lock().expect("lock").insert(key, result);
}
pub fn set_fallback(&self, result: RunResult) {
*self.fallback.lock().expect("lock") = Some(result);
}
pub fn history(&self) -> Vec<CommandSpec> {
self.history.lock().expect("lock").clone()
}
}
impl ProcessRunner for FakeProcessRunner {
fn run(&self, spec: &CommandSpec) -> Result<RunResult, AdapterError> {
self.history.lock().expect("lock").push(spec.clone());
let key = spec.argv.join(" ");
let results = self.results.lock().expect("lock");
if let Some(res) = results.get(&key) {
return Ok(res.clone());
}
let fallback = self.fallback.lock().expect("lock");
if let Some(res) = &*fallback {
return Ok(res.clone());
}
Err(AdapterError::Other(format!(
"FakeProcessRunner: no result configured for command: {:?}",
spec.argv
)))
}
}