use crate::{ExecutorError, ExecutorResult};
use std::{io, io::Cursor, process::Output};
#[derive(Debug)]
pub enum InputCompletion {
Complete,
Interrupted,
SourceFailed(ExecutorError),
WriteFailed(io::Error),
}
#[derive(Debug)]
pub struct ExecutionCompletion {
pub output: Output,
pub input: InputCompletion,
}
impl ExecutionCompletion {
pub fn into_result(self) -> ExecutorResult {
match self.input {
InputCompletion::SourceFailed(error) => return Err(error),
InputCompletion::WriteFailed(error) if error.kind() != io::ErrorKind::BrokenPipe => {
return Err(error.into());
},
input => {
if !self.output.status.success() {
return Err(self.output.into());
}
match input {
InputCompletion::Complete => {},
InputCompletion::Interrupted => return Err(ExecutorError::IncompleteInput),
InputCompletion::WriteFailed(error) => return Err(error.into()),
InputCompletion::SourceFailed(_) => unreachable!(),
}
},
}
Ok(Cursor::new(self.output.stdout))
}
}
pub(crate) enum InputFailure {
Source(ExecutorError),
Write(io::Error),
}
impl From<io::Error> for InputFailure {
fn from(error: io::Error) -> Self {
Self::Write(error)
}
}