use std::env;
use std::io::Result;
use std::path::PathBuf;
use std::process::{Command, Output};
use serde::Deserialize;
use super::OutputFormat;
#[derive(Deserialize)]
pub struct Preprocessor {
pub command: String,
#[serde(default)]
pub flags: Vec<String>,
pub prefix: Option<String>,
#[serde(default)]
pub format: OutputFormat
}
impl Preprocessor {
pub fn new(command: &str) -> Self {
Preprocessor {
command: command.to_owned(),
flags: vec![],
prefix: None,
format: OutputFormat::Bytes
}
}
pub fn rewrite_arguments(&self, args: &Vec<String>) -> Vec<String> {
args.iter().map(|p| {
let mut buf = PathBuf::new();
if let Some(root) = env::var("CARGO_MANIFEST_DIR").ok() {
buf.push(root);
}
if let Some(prefix) = &self.prefix {
buf.push(prefix);
}
buf.push(p);
buf.to_string_lossy().to_string()
})
.collect::<Vec<String>>()
}
pub fn execute(&self, args: &Vec<String>) -> Result<Output> {
Command::new(&self.command)
.args(&self.flags)
.args(args)
.output()
}
}