use std::{
future::{Future, Ready},
io::{Cursor, Result},
};
use tokio::io::{AsyncRead, AsyncSeek};
pub trait EntryData {
type Reader: AsyncRead + AsyncSeek;
type Future: Future<Output = Result<Self::Reader>>;
fn get_reader(&self) -> Self::Future;
}
pub trait EntrySize {
type Future: Future<Output = Result<u64>>;
fn size(&self) -> Self::Future;
}
impl EntryData for () {
type Reader = std::io::Cursor<&'static [u8]>;
type Future = std::future::Ready<Result<Self::Reader>>;
fn get_reader(&self) -> Self::Future {
std::future::ready(Ok(std::io::Cursor::new(&[])))
}
}
impl EntrySize for () {
type Future = std::future::Ready<Result<u64>>;
fn size(&self) -> Self::Future {
std::future::ready(Ok(0))
}
}
impl<'a> EntryData for &'a [u8] {
type Reader = Cursor<&'a [u8]>;
type Future = Ready<Result<Self::Reader>>;
fn get_reader(&self) -> Self::Future {
std::future::ready(Ok(Cursor::new(self)))
}
}
impl<'a> EntrySize for &'a [u8] {
type Future = Ready<Result<u64>>;
fn size(&self) -> Self::Future {
std::future::ready(Ok(self.len() as u64))
}
}