use super::{CacheKey, CacheMeta};
use crate::key::CompactCacheKey;
use crate::trace::SpanHandle;
use async_trait::async_trait;
use pingora_error::Result;
use std::any::Any;
#[async_trait]
pub trait Storage {
async fn lookup(
&'static self,
key: &CacheKey,
trace: &SpanHandle,
) -> Result<Option<(CacheMeta, HitHandler)>>;
async fn get_miss_handler(
&'static self,
key: &CacheKey,
meta: &CacheMeta,
trace: &SpanHandle,
) -> Result<MissHandler>;
async fn purge(&'static self, key: &CompactCacheKey, trace: &SpanHandle) -> Result<bool>;
async fn update_meta(
&'static self,
key: &CacheKey,
meta: &CacheMeta,
trace: &SpanHandle,
) -> Result<bool>;
fn support_streaming_partial_write(&self) -> bool {
false
}
fn as_any(&self) -> &(dyn Any + Send + Sync + 'static);
}
#[async_trait]
pub trait HandleHit {
async fn read_body(&mut self) -> Result<Option<bytes::Bytes>>;
async fn finish(
self: Box<Self>, storage: &'static (dyn Storage + Sync),
key: &CacheKey,
trace: &SpanHandle,
) -> Result<()>;
fn can_seek(&self) -> bool {
false
}
fn seek(&mut self, _start: usize, _end: Option<usize>) -> Result<()> {
todo!("seek() needs to be implemented")
}
fn as_any(&self) -> &(dyn Any + Send + Sync);
}
pub type HitHandler = Box<(dyn HandleHit + Sync + Send)>;
#[async_trait]
pub trait HandleMiss {
async fn write_body(&mut self, data: bytes::Bytes, eof: bool) -> Result<()>;
async fn finish(
self: Box<Self>, ) -> Result<usize>;
}
pub type MissHandler = Box<(dyn HandleMiss + Sync + Send)>;