// Consumer hooks run when an application receives a message and when it
// acknowledges or negatively acknowledges that message.

///|
pub struct ConsumerInterceptor {
  priv before_consume : ((Message) -> Unit)?
  priv on_receive_error : ((Error) -> Unit)?
  priv on_ack : ((MessageId, Result[Unit, Error]) -> Unit)?
  priv on_nack : ((MessageId, Result[Unit, Error]) -> Unit)?
}

///|
pub fn ConsumerInterceptor::new(
  before_consume? : (Message) -> Unit,
  on_receive_error? : (Error) -> Unit,
  on_ack? : (MessageId, Result[Unit, Error]) -> Unit,
  on_nack? : (MessageId, Result[Unit, Error]) -> Unit,
) -> ConsumerInterceptor {
  { before_consume, on_receive_error, on_ack, on_nack, }
}

///|
fn ConsumerInterceptor::receive_failed(
  self : ConsumerInterceptor,
  error : Error,
) -> Unit {
  if self.on_receive_error is Some(callback) {
    callback(error)
  }
}

///|
fn ConsumerInterceptor::delivered(
  self : ConsumerInterceptor,
  message : Message,
) -> Unit {
  if self.before_consume is Some(callback) {
    callback(message)
  }
}

///|
fn ConsumerInterceptor::acked(
  self : ConsumerInterceptor,
  id : MessageId,
  result : Result[Unit, Error],
) -> Unit {
  if self.on_ack is Some(callback) {
    callback(id, result)
  }
}

///|
fn ConsumerInterceptor::nacked(
  self : ConsumerInterceptor,
  id : MessageId,
  result : Result[Unit, Error],
) -> Unit {
  if self.on_nack is Some(callback) {
    callback(id, result)
  }
}