use crate::{CommandExt, Executor, ExecutorError, GraphInput, GraphOutput, JsonlStream};
use alloc::boxed::Box;
use async_trait::async_trait;
use derive_more::Debug;
use std::{ffi::OsStr, process::Stdio};
pub use asimov_patterns::ReasonerOptions;
pub type ReasonerResult = Result<JsonlStream, ExecutorError>;
#[allow(unused)]
#[derive(Debug)]
pub struct Reasoner {
executor: Executor,
options: ReasonerOptions,
input: GraphInput,
output: GraphOutput,
}
impl Reasoner {
pub fn new(
program: impl AsRef<OsStr>,
input: GraphInput,
output: GraphOutput,
options: ReasonerOptions,
) -> Self {
let mut executor = Executor::new(program);
executor
.command()
.option("input", options.input.as_ref())
.option("output", options.output.as_ref())
.args(&options.other)
.stdin(input.as_stdio())
.stdout(output.as_stdio())
.stderr(Stdio::piped());
Self {
executor,
options,
input: input.into_jsonl(),
output,
}
}
pub async fn execute(&mut self) -> ReasonerResult {
self.executor
.execute_jsonl_with_io(&mut self.input, &mut self.output)
.await
}
}
impl asimov_patterns::Reasoner<JsonlStream> for Reasoner {}
crate::batch::with_batching!(Reasoner);
crate::pipeline::stage!(
Reasoner,
value,
value.input,
value.output,
value.options.input.as_deref(),
value.options.output.as_deref()
);
#[async_trait]
impl asimov_patterns::Execute<JsonlStream> for Reasoner {
type Error = ExecutorError;
async fn execute(&mut self) -> ReasonerResult {
self.execute().await
}
}
#[cfg(test)]
mod tests {
#[tokio::test]
async fn test_execute() {
}
}