use std::io::{Read, Result, Seek, Write};
pub trait StorageReadProvider: Sync {
type Reader: Read + Seek;
fn open_reader(&self, item_identifier: &str) -> Result<Self::Reader>;
fn get_length(&self, item_identifier: &str) -> Result<u64>;
fn exists(&self, item_identifier: &str) -> bool;
}
pub trait StorageWriteProvider: Sync {
type Writer: WriteSeek;
fn open_writer(&self, item_identifier: &str) -> Result<Self::Writer>;
fn create_for_write(&self, item_identifier: &str) -> Result<Self::Writer>;
fn delete(&self, item_identifier: &str) -> Result<()>;
}
pub trait WriteSeek: Write + Seek {}
impl<T> WriteSeek for T where T: Write + Seek {}
pub trait DynWriteProvider: Sync {
fn open_writer(&self, item_identifier: &str) -> std::io::Result<Box<dyn WriteSeek + '_>>;
fn create_for_write(&self, item_identifier: &str) -> std::io::Result<Box<dyn WriteSeek + '_>>;
fn delete(&self, item_identifier: &str) -> std::io::Result<()>;
}
impl<T> DynWriteProvider for T
where
T: StorageWriteProvider,
{
fn open_writer(&self, item_identifier: &str) -> std::io::Result<Box<dyn WriteSeek + '_>> {
self.open_writer(item_identifier)
.map(|w| Box::new(w) as Box<dyn WriteSeek>)
}
fn create_for_write(&self, item_identifier: &str) -> std::io::Result<Box<dyn WriteSeek + '_>> {
self.create_for_write(item_identifier)
.map(|w| Box::new(w) as Box<dyn WriteSeek>)
}
fn delete(&self, item_identifier: &str) -> std::io::Result<()> {
self.delete(item_identifier)
}
}
pub struct WriteProviderWrapper<'a> {
inner: &'a dyn DynWriteProvider,
}
impl<'a> WriteProviderWrapper<'a> {
pub const fn new(inner: &'a dyn DynWriteProvider) -> Self {
Self { inner }
}
}
impl<'a> StorageWriteProvider for WriteProviderWrapper<'a> {
type Writer = Box<dyn WriteSeek + 'a>;
fn open_writer(&self, item_identifier: &str) -> std::io::Result<Self::Writer> {
self.inner.open_writer(item_identifier)
}
fn create_for_write(&self, item_identifier: &str) -> std::io::Result<Self::Writer> {
self.inner.create_for_write(item_identifier)
}
fn delete(&self, item_identifier: &str) -> std::io::Result<()> {
self.inner.delete(item_identifier)
}
}