use std::future::Future;
use std::time::Instant;
#[derive(Debug, Clone, Copy)]
pub struct ObjectStatus {
created: Instant,
last_returned: Option<Instant>,
recycle_count: usize,
}
impl Default for ObjectStatus {
fn default() -> Self {
Self {
created: Instant::now(),
last_returned: None,
recycle_count: 0,
}
}
}
impl ObjectStatus {
pub fn created(&self) -> Instant {
self.created
}
pub fn last_used(&self) -> Instant {
self.last_returned.unwrap_or(self.created)
}
pub fn recycle_count(&self) -> usize {
self.recycle_count
}
pub(crate) fn mark_recycled(&mut self) {
self.recycle_count += 1;
}
pub(crate) fn mark_returned(&mut self) {
self.last_returned = Some(Instant::now());
}
}
#[derive(Debug)]
#[non_exhaustive]
pub struct RetainResult<T> {
pub retained: usize,
pub removed: Vec<T>,
}
pub trait ManageObject: Send + Sync {
type Object: Send;
type Error: Send;
fn create(&self) -> impl Future<Output = Result<Self::Object, Self::Error>> + Send;
fn is_recyclable(
&self,
o: &mut Self::Object,
status: &ObjectStatus,
) -> impl Future<Output = Result<(), Self::Error>> + Send;
fn on_detached(&self, _o: &mut Self::Object) {}
}
#[derive(Debug, Default, Clone, Copy)]
pub enum QueueStrategy {
#[default]
Fifo,
Lifo,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum RecycleCancelledStrategy {
#[default]
Detach,
ReturnToPool,
}