use ic_stable_structures::Memory;
use crate::{
error::Error,
fs::ChunkSize,
fs::ChunkType,
storage::types::{DirEntry, DirEntryIndex, FileSize, Metadata, Node},
};
mod allocator;
mod chunk_iterator;
pub mod dummy;
mod journal;
mod metadata_cache;
mod ptr_cache;
pub mod stable;
pub mod transient;
pub mod types;
pub trait Storage {
fn root_node(&self) -> Node;
fn get_version(&self) -> u32;
fn new_node(&mut self) -> Node;
fn mount_node(&mut self, node: Node, memory: Box<dyn Memory>) -> Result<(), Error>;
fn unmount_node(&mut self, node: Node) -> Result<Box<dyn Memory>, Error>;
fn is_mounted(&self, node: Node) -> bool;
fn get_mounted_memory(&self, node: Node) -> Option<&dyn Memory>;
fn init_mounted_memory(&mut self, node: Node) -> Result<(), Error>;
fn store_mounted_memory(&mut self, node: Node) -> Result<(), Error>;
fn get_metadata(&self, node: Node) -> Result<Metadata, Error>;
fn put_metadata(&mut self, node: Node, metadata: Metadata);
fn get_direntry(&self, node: Node, index: DirEntryIndex) -> Result<DirEntry, Error>;
fn put_direntry(&mut self, node: Node, index: DirEntryIndex, entry: DirEntry);
fn rm_direntry(&mut self, node: Node, index: DirEntryIndex);
fn read(
&mut self,
node: Node,
read_offset: FileSize,
buf: &mut [u8],
) -> Result<FileSize, Error>;
fn write(&mut self, node: Node, offset: FileSize, buf: &[u8]) -> Result<FileSize, Error>;
fn rm_file(&mut self, node: Node) -> Result<(), Error>;
fn set_chunk_size(&mut self, chunk_size: ChunkSize) -> Result<(), Error>;
fn chunk_size(&self) -> usize;
fn set_chunk_type(&mut self, chunk_type: ChunkType);
fn chunk_type(&self) -> ChunkType;
fn flush(&mut self, node: Node);
}