jc_wrapper/
jc.rs

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    /// Called on a Command.
8    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}