#![cfg(feature = "dynamic-fs")]
use crate::__private::wasip1;
use crate::wasi::file::{
ConstDefault, InodeIdCommon, OpenFdInfo, OpenFdInfoWithInode, WasiAddInfo,
};
use alloc::{collections::BTreeMap, string::String, vec::Vec};
use smallstr::SmallString;
pub type InodeId = usize;
pub type DirMap = BTreeMap<SmallString<[u8; 32]>, InodeId>;
#[derive(Debug, Clone)]
pub enum InodeData {
File(Vec<u8>),
Dir(DirMap),
Symlink(String),
}
#[derive(Debug, Clone)]
pub struct InodeMetadata<AddInfo: WasiAddInfo> {
pub filetype: wasip1::Filetype,
pub nlink: wasip1::Linkcount,
pub rights: wasip1::Rights,
pub add_info: AddInfo,
}
impl<AddInfo: WasiAddInfo + ConstDefault> InodeMetadata<AddInfo> {
pub const fn new_const(filetype: wasip1::Filetype, rights: wasip1::Rights) -> Self {
Self {
filetype,
nlink: 1,
rights,
add_info: AddInfo::DEFAULT,
}
}
}
impl<AddInfo: WasiAddInfo> InodeMetadata<AddInfo> {
pub fn new(filetype: wasip1::Filetype, rights: wasip1::Rights, add_info: AddInfo) -> Self {
Self {
filetype,
nlink: 1,
rights,
add_info,
}
}
pub fn size(&self, data: &InodeData) -> wasip1::Filesize {
match data {
InodeData::File(vec) => vec.len() as wasip1::Filesize,
InodeData::Dir(_) => 0,
InodeData::Symlink(target) => target.len() as wasip1::Filesize,
}
}
}
#[derive(Debug, Clone)]
pub struct Inode<AddInfo: WasiAddInfo> {
pub meta: InodeMetadata<AddInfo>,
pub data: InodeData,
}
#[derive(Debug, Clone)]
pub struct DetailedOpenFd<InodeId: InodeIdCommon> {
pub inode_id: InodeId,
pub cursor: usize,
pub base_rights: wasip1::Rights,
pub inheriting_rights: wasip1::Rights,
pub fd_flags: wasip1::Fdflags,
}
impl<InodeId: InodeIdCommon> OpenFdInfo for DetailedOpenFd<InodeId> {
fn cursor(&self) -> usize {
self.cursor
}
fn set_cursor(&mut self, cursor: usize) {
self.cursor = cursor;
}
fn base_rights(&self) -> wasip1::Rights {
self.base_rights
}
fn set_base_rights(&mut self, base_rights: wasip1::Rights) {
self.base_rights = base_rights;
}
fn inheriting_rights(&self) -> wasip1::Rights {
self.inheriting_rights
}
fn set_inheriting_rights(&mut self, inheriting_rights: wasip1::Rights) {
self.inheriting_rights = inheriting_rights;
}
fn fd_flags(&self) -> wasip1::Fdflags {
self.fd_flags
}
fn set_fd_flags(&mut self, fd_flags: wasip1::Fdflags) {
self.fd_flags = fd_flags;
}
}
impl<InodeId: InodeIdCommon> OpenFdInfoWithInode for DetailedOpenFd<InodeId> {
type InodeId = InodeId;
fn from_inode_id(inode_id: Self::InodeId) -> Self {
Self {
inode_id,
cursor: 0,
base_rights: 0,
inheriting_rights: 0,
fd_flags: 0,
}
}
fn inode_id(&self) -> &Self::InodeId {
&self.inode_id
}
fn set_inode_id(&mut self, inode_id: Self::InodeId) {
self.inode_id = inode_id;
}
}
#[allow(dead_code)]
pub trait InodeConstraint: core::fmt::Debug + Into<InodeId> + From<InodeId> {}