use std::sync::Arc;
use std::{collections::HashMap, hash::Hash};
use crate::Client;
use async_trait::async_trait;
#[async_trait]
pub trait Selector: Clone + Sync + Send {
type Target;
type Error;
async fn flush(&self) -> &Self;
fn as_client(&self) -> &Arc<Client>;
fn as_selector(&self) -> &Self {
self
}
}
#[async_trait]
pub trait SingleSelector: Selector {
async fn fetch(&self) -> Result<Self::Target, Self::Error>;
async fn flush_and_fetch(&self) -> Result<Self::Target, Self::Error> {
self.flush().await.fetch().await
}
}
#[async_trait]
pub trait OptionSelector: Selector {
async fn fetch(&self) -> Result<Option<Self::Target>, Self::Error>;
async fn flush_and_fetch(&self) -> Result<Option<Self::Target>, Self::Error> {
self.flush().await.fetch().await
}
}
#[async_trait]
pub trait MultiSelector: Selector {
type Key: Clone + Hash + Eq;
async fn fetch(&self) -> Result<HashMap<Self::Key, Self::Target>, Self::Error>;
async fn flush_and_fetch(&self) -> Result<HashMap<Self::Key, Self::Target>, Self::Error> {
self.flush().await;
self.fetch().await
}
}