asimov_runner/programs/
writer.rs1use crate::{AnyOutput, Executor, ExecutorError, GraphInput};
4use async_trait::async_trait;
5use derive_more::Debug;
6use std::{
7 ffi::OsStr,
8 io::{Cursor, Read},
9 process::Stdio,
10};
11use tokio::io::{AsyncRead, AsyncWrite};
12
13pub use asimov_patterns::WriterOptions;
14
15pub type WriterResult = std::result::Result<Cursor<Vec<u8>>, ExecutorError>; #[allow(unused)]
20#[derive(Debug)]
21pub struct Writer {
22 executor: Executor,
23 options: WriterOptions,
24 input: GraphInput,
25 output: AnyOutput,
26}
27
28impl Writer {
29 pub fn new(
30 program: impl AsRef<OsStr>,
31 input: GraphInput,
32 output: AnyOutput,
33 options: WriterOptions,
34 ) -> Self {
35 let mut executor = Executor::new(program);
36 executor
37 .command()
38 .args(if let Some(ref input) = options.input {
39 vec![format!("--input={}", input)]
40 } else {
41 vec![]
42 })
43 .args(if let Some(ref output) = options.output {
44 vec![format!("--output={}", output)]
45 } else {
46 vec![]
47 })
48 .args(&options.other)
49 .stdin(input.as_stdio())
50 .stdout(output.as_stdio())
51 .stderr(Stdio::piped());
52
53 Self {
54 executor,
55 options,
56 input,
57 output,
58 }
59 }
60
61 pub async fn execute(&mut self) -> WriterResult {
62 let stdout = self.executor.execute_with_input(&mut self.input).await?;
63 Ok(stdout)
64 }
65}
66
67impl asimov_patterns::Writer<Cursor<Vec<u8>>, ExecutorError> for Writer {}
68
69#[async_trait]
70impl asimov_patterns::Execute<Cursor<Vec<u8>>, ExecutorError> for Writer {
71 async fn execute(&mut self) -> WriterResult {
72 self.execute().await
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79 use asimov_patterns::Execute;
80
81 #[tokio::test]
82 async fn test_execute() {
83 }
85}