hippo_shared/
preprocessor.rs1use std::env;
7use std::io::Result;
8use std::path::PathBuf;
9use std::process::{Command, Output};
10
11use serde::Deserialize;
12
13use super::OutputFormat;
14
15#[derive(Deserialize)]
17pub struct Preprocessor {
18 pub command: String,
20
21 #[serde(default)]
23 pub flags: Vec<String>,
24
25 pub prefix: Option<String>,
27
28 #[serde(default)]
30 pub format: OutputFormat
31}
32
33impl Preprocessor {
34 pub fn new(command: &str) -> Self {
36 Preprocessor {
37 command: command.to_owned(),
38 flags: vec![],
39
40 prefix: None,
41
42 format: OutputFormat::Bytes
43 }
44 }
45
46 pub fn rewrite_arguments(&self, args: &Vec<String>) -> Vec<String> {
48 args.iter().map(|p| {
49 let mut buf = PathBuf::new();
50
51 if let Some(root) = env::var("CARGO_MANIFEST_DIR").ok() {
52 buf.push(root);
53 }
54
55 if let Some(prefix) = &self.prefix {
56 buf.push(prefix);
57 }
58
59 buf.push(p);
60
61 buf.to_string_lossy().to_string()
62 })
63 .collect::<Vec<String>>()
64 }
65
66 pub fn execute(&self, args: &Vec<String>) -> Result<Output> {
68 Command::new(&self.command)
69 .args(&self.flags)
70 .args(args)
71 .output()
72 }
73}