use std::error::Error;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::Mutex;
use tokio::sync::mpsc::{Receiver, Sender};
use crate::config::Config;
use crate::consumer::attempt::ConsumeAttempt;
#[async_trait]
pub trait Consumer: Send {
type ConsumeAttempt: ConsumeAttempt;
type ConsumeError: Send + Error;
type Config: Config;
async fn new(
init_config: Arc<Mutex<Self::Config>>,
recv_channel: Receiver<Self::ConsumeAttempt>,
send_channel: Sender<ConsumeAttemptResult<Self::ConsumeAttempt>>,
) -> Result<Self, Self::ConsumeError>
where
Self: Sized;
async fn consumer_loop(&mut self) -> Result<(), Self::ConsumeError>;
}
#[derive(Debug, Clone)]
pub enum ConsumeAttemptResult<T: ConsumeAttempt> {
Success(T::Identifier, T::ReturnCtx),
Failure(T::Identifier, T::ReturnCtx),
}