use std::error::Error;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::Mutex;
use crate::config::Config;
use crate::consumer::ConsumeAttempt;
use crate::consumer::consumer::ConsumeAttemptResult;
use crate::transform::{TransformAttempt, TransformRequest};
use crate::worker::worker_manager::WorkerManagerResult;
#[async_trait]
pub trait Database: Send + Sync {
type Input;
type Output;
type Config: Config;
type TransformRequest: TransformRequest<Input = Self::Input, Output = Self::Output>;
type TransformAttempt: TransformAttempt<CallArgsType = Self::Input, ReturnType = Self::Output>;
type ConsumeAttempt: ConsumeAttempt<ConsumeVal = Self::Output>;
type DatabaseError: Send + Sync + Error;
async fn new(ctx: Arc<Mutex<Self::Config>>) -> Result<Self, Self::DatabaseError>
where
Self: Sized;
async fn get_dyn_configs(
&mut self,
) -> Result<
Vec<(
<Self::Config as Config>::KeyType,
<Self::Config as Config>::ValueType,
)>,
Self::DatabaseError,
>;
async fn register_transform_request(
&mut self,
request: &Self::TransformRequest,
) -> Result<(), Self::DatabaseError>;
async fn register_transform_attempt(
&mut self,
attempt: &Self::TransformAttempt,
) -> Result<(), Self::DatabaseError>;
async fn update_transform_attempt(
&mut self,
attempt: &WorkerManagerResult<Self::TransformAttempt>,
) -> Result<(), Self::DatabaseError>;
async fn register_consume_attempt(
&mut self,
attempt: &Self::ConsumeAttempt,
) -> Result<(), Self::DatabaseError>;
async fn update_consume_attempt(
&mut self,
attempt: ConsumeAttemptResult<Self::ConsumeAttempt>,
) -> Result<(), Self::DatabaseError>;
async fn archive_request_with_id(
&mut self,
request: &<Self::TransformRequest as TransformRequest>::Identifier,
) -> Result<(), Self::DatabaseError>;
}