///|
pub suberror SourcedError {
  SourcedError(error~ : Error?, loc~ : SourceLoc, msg~ : String)
} derive(Debug)

///|
pub impl Show for SourcedError with fn output(self, logger) {
  match self {
    SourcedError(error~, loc~, msg~) => {
      if !msg.is_empty() {
        logger.write_string("ensuring '\{msg}' ")
      }
      logger.write_string("failed ")
      if error is Some(error) {
        logger.write_string("with `\{error}` ")
      }
      logger.write_string("at \{loc}")
    }
  }
}

///|
#inline
#callsite(autofill(loc))
pub fn ensure(
  cond : Bool,
  error? : Error,
  msg~ : String,
  loc~ : SourceLoc,
) -> Unit raise SourcedError {
  if !cond {
    raise SourcedError(error~, loc~, msg~)
  }
}