use thiserror::Error;
#[derive(Error, Debug)]
pub enum ScriptError {
#[error("Command not found: {0}")]
CommandNotFound(String),
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("Invalid argument: {0}")]
InvalidArgument(String),
#[error("Invalid working directory: {0}")]
InvalidWorkingDirectory(String),
#[error("Command failed with exit code {code}: {stderr}")]
ExecutionFailed {
code: i32,
stderr: String,
},
#[error("Command timed out after {0:?}")]
Timeout(std::time::Duration),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("Environment error: {0}")]
EnvironmentError(String),
#[error("Encoding error: {0}")]
EncodingError(String),
#[error("Validation error: {0}")]
ValidationError(String),
#[error("Pipeline error: {0}")]
PipelineError(String),
#[error("Pipeline has no commands")]
PipelineEmpty,
#[error("Failed to connect pipeline stdin: {0}")]
PipelineStdinError(String),
#[error("Failed to connect pipeline stdout: {0}")]
PipelineStdoutError(String),
#[error("Argument validation error: {0}")]
ArgumentError(String),
#[error("Child process error: {0}")]
ChildError(String),
#[error("Shell execution error: {0}")]
ShellError(String),
#[error("Error: {0}")]
Other(String),
}
pub type ScriptResult<T> = Result<T, ScriptError>;
impl From<std::process::Output> for ScriptError {
fn from(output: std::process::Output) -> Self {
let code = output.status.code().unwrap_or(-1);
let stderr = String::from_utf8_lossy(&output.stderr).into_owned();
ScriptError::ExecutionFailed { code, stderr }
}
}