1use crate::{JcWrapper, CmdOutput, Error};
2use std::process::{Stdio, Command};
3use serde::Deserialize;
4
5impl<T: for<'a> Deserialize<'a>> JcWrapper<T> for Command {
6
7 fn parse(&mut self, output_type: CmdOutput) -> Result<T, Error> {
9
10 let output = self.stdout(Stdio::piped())
11 .spawn().map_err(|_| Error::CouldNotSpawnCommand)?;
12
13 if let Some(text) = output.stdout {
14 let jc = Command::new("jc")
15 .arg(output_type.get_flag())
16 .stdin(Stdio::from(text))
17 .output();
18
19 let jc = match jc {
20 Ok(output) => output,
21 Err(err) => { return Err(Error::CouldNotSpawnJc(err)); },
22 };
23
24
25 let parsed_output = serde_json::from_slice(&jc.stdout).map_err(|_| Error::CouldNotParse)?;
26
27 Ok(parsed_output)
28 } else {
29 Err(Error::NoOutput.into())
30 }
31 }
32
33}