use std::fmt::Debug;
use std::path::Path;
use crate::common::universal_io::cached_fs::FileInfo;
use crate::common::universal_io::traits::append::UniversalAppend;
use crate::common::universal_io::traits::open_extra::OpenExtra;
use crate::common::universal_io::traits::read::UniversalRead;
use crate::common::universal_io::{ListedFile, OpenOptions, UioResult};
pub trait UniversalReadFileOps: Clone + Debug + Send + Sync + Sized {
type ContextConfig;
fn from_context(context: Self::ContextConfig) -> UioResult<Self>;
fn list_files(&self, prefix_path: &Path) -> UioResult<Vec<ListedFile>>;
fn exists(&self, path: &Path) -> UioResult<bool>;
}
pub trait UniversalWriteFileOps: UniversalReadFileOps {
type AppendFile: UniversalAppend;
fn create(&self, path: &Path, expected_length: usize) -> UioResult<()>;
fn create_dir(&self, path: &Path) -> UioResult<()>;
fn remove(&self, path: &Path) -> UioResult<()>;
fn remove_dir(&self, path: &Path) -> UioResult<()>;
fn atomic_save(&self, path: &Path, bytes: &[u8]) -> UioResult<()>;
fn open_append(
&self,
path: impl AsRef<Path>,
options: OpenOptions,
) -> UioResult<Self::AppendFile>;
}
pub trait UniversalReadFs: UniversalReadFileOps {
type File: UniversalRead;
type OpenExtra: OpenExtra;
fn open(
&self,
path: impl AsRef<Path>,
options: OpenOptions,
extra: Self::OpenExtra,
) -> UioResult<Self::File>;
}
pub trait CachedReadFs: UniversalReadFs {
fn cache_file_info(&mut self) -> UioResult<()>;
fn schedule_prefetch(
&self,
path: &Path,
open_arguments: Option<OpenOptions>,
open_extra: Option<Self::OpenExtra>,
) -> UioResult<()>;
fn cached_file_info(&self, path: &Path) -> Option<FileInfo>;
}