///|
/// Failures while spawning or managing a child process.
pub(all) suberror ProcessError {
  SpawnFailed(detail~ : String)
  WaitFailed(detail~ : String)
  KillFailed(detail~ : String)
} derive(Eq)

///|
pub extend ProcessError with Eq::{not_equal, equal}

///|
pub extend ProcessError with Show::{to_string, output}

///|
fn ProcessError::message(self : ProcessError) -> String {
  match self {
    SpawnFailed(detail~) => "failed to spawn process: " + detail
    WaitFailed(detail~) => "failed to wait for process: " + detail
    KillFailed(detail~) => "failed to kill process: " + detail
  }
}

///|
pub impl Show for ProcessError with fn output(self, logger) {
  logger.write_string(self.message())
}