use ic_stable_structures::Memory;
use crate::{
error::Error,
storage::types::{DirEntry, DirEntryIndex, FileSize, Metadata, Node},
};
pub mod allocator;
pub mod dummy;
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(&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>;
}