use std::sync::Arc;
use async_trait::async_trait;
use bytes::Bytes;
use object_store::path::Path;
use object_store::{GetOptions, PutMultipartOptions, PutOptions};
use crate::MirrorHandle;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReadRoute {
Remote,
Observe,
Local,
Refetch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WriteRoute {
Remote,
Observe,
Mirror,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MultipartRoute {
Remote,
Mirror,
}
#[async_trait]
pub trait MirrorPolicy: Send + Sync + 'static {
fn read_route(&self, path: &Path, options: &GetOptions) -> object_store::Result<ReadRoute>;
fn put_route(&self, path: &Path, options: &PutOptions) -> object_store::Result<WriteRoute>;
fn put_multipart_route(
&self,
path: &Path,
options: &PutMultipartOptions,
) -> object_store::Result<MultipartRoute>;
async fn observe(
&self,
path: &Path,
bytes: &Bytes,
mirror: &MirrorHandle,
) -> object_store::Result<()> {
let _ = (path, bytes, mirror);
Ok(())
}
async fn run(self: Arc<Self>, mirror: MirrorHandle) {
let _ = mirror;
}
}