use std::sync::Arc;
use futures::FutureExt;
use futures::future::{BoxFuture, LocalBoxFuture};
use futures::stream::BoxStream;
use vortex_error::VortexResult;
use crate::file::IoRequest;
use crate::runtime::Handle;
pub trait IntoReadSource {
fn into_read_source(self, handle: Handle) -> VortexResult<ReadSourceRef>;
}
pub type ReadSourceRef = Arc<dyn ReadSource>;
pub trait ReadSource: Send + Sync {
fn uri(&self) -> &Arc<str>;
fn coalesce_window(&self) -> Option<CoalesceWindow>;
fn size(&self) -> BoxFuture<'static, VortexResult<u64>>;
fn drive_send(
self: Arc<Self>,
requests: BoxStream<'static, IoRequest>,
) -> BoxFuture<'static, ()>;
fn drive_local(
self: Arc<Self>,
requests: BoxStream<'static, IoRequest>,
) -> LocalBoxFuture<'static, ()> {
self.drive_send(requests).boxed_local()
}
}
#[derive(Clone, Copy, Debug)]
pub struct CoalesceWindow {
pub distance: u64,
pub max_size: u64,
}