///|
/// Protocol-level error of the SPOP protocol.
///
/// Carries a `StatusCode` that can be reported to the peer inside a
/// DISCONNECT frame, plus a human-readable message.
pub suberror SpopError {
  SpopError(code~ : StatusCode, message~ : String)
}

///|
pub impl Show for SpopError with fn output(self : SpopError, logger : &Logger) -> Unit {
  let SpopError(code~, message~) = self
  logger <+ "SpopError(code=\{Repr(code)}, message=\{message})"
}

///|
/// Create a `SpopError` from a status code and a message.
pub fn SpopError::new(code : StatusCode, message : String) -> SpopError {
  SpopError(code~, message~)
}

///|
/// The status code carried by this error.
pub fn SpopError::code(self : SpopError) -> StatusCode {
  let SpopError(code~, ..) = self
  code
}

///|
/// The human-readable message carried by this error.
pub fn SpopError::message(self : SpopError) -> String {
  let SpopError(message~, ..) = self
  message
}