use super::{InputTranslator, IoTranslators, OutputTranslator};
use crate::process_io::IoProcess;
use anyhow::Result;
use navm::{cmd::Cmd, output::Output};
use std::{ffi::OsStr, process::Command};
pub struct CommandVm {
pub(super) io_process: IoProcess,
pub(super) input_translator: Option<Box<InputTranslator>>,
pub(super) output_translator: Option<Box<OutputTranslator>>,
}
impl CommandVm {
pub fn new(program_path: impl AsRef<OsStr>) -> Self {
let io_process = IoProcess::new(program_path);
Self::from(io_process)
}
pub fn input_translator(
&mut self,
translator: impl Fn(Cmd) -> Result<String> + Send + Sync + 'static,
) {
self.input_translator = Some(Box::new(translator));
}
pub fn output_translator(
&mut self,
translator: impl Fn(String) -> Result<Output> + Send + Sync + 'static,
) {
self.output_translator = Some(Box::new(translator));
}
pub fn translators(&mut self, translators: impl Into<IoTranslators>) {
let translators = translators.into();
self.input_translator = Some(translators.input_translator);
self.output_translator = Some(translators.output_translator);
}
}
impl From<IoProcess> for CommandVm {
fn from(io_process: IoProcess) -> Self {
Self {
io_process,
input_translator: None,
output_translator: None,
}
}
}
impl From<Command> for CommandVm {
fn from(command: Command) -> Self {
Self::from(IoProcess::from(command))
}
}