i guess this is a way to do refs
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use crate::Error;
|
||||
use bitflags::bitflags;
|
||||
use fs_set_times::SetTimes;
|
||||
use std::cell::Ref;
|
||||
use std::ops::Deref;
|
||||
use system_interface::fs::FileIoExt;
|
||||
|
||||
@@ -92,9 +93,9 @@ impl FileEntry {
|
||||
FileEntry { caps, file }
|
||||
}
|
||||
|
||||
pub fn get_cap(&self, caps: FileCaps) -> Result<&dyn WasiFile, Error> {
|
||||
pub fn capable_of(&self, caps: FileCaps) -> Result<(), Error> {
|
||||
if self.caps.contains(caps) {
|
||||
Ok(self.file.deref())
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::FileNotCapable {
|
||||
desired: caps,
|
||||
@@ -104,12 +105,9 @@ impl FileEntry {
|
||||
}
|
||||
|
||||
pub fn drop_caps_to(&mut self, caps: FileCaps) -> Result<(), Error> {
|
||||
if self.caps.contains(caps) {
|
||||
self.capable_of(caps)?;
|
||||
self.caps = caps;
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::NotCapable)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_fdstat(&self) -> Result<FdStat, Error> {
|
||||
@@ -121,6 +119,17 @@ impl FileEntry {
|
||||
}
|
||||
}
|
||||
|
||||
pub trait FileEntryExt<'a> {
|
||||
fn get_cap(self, caps: FileCaps) -> Result<Ref<'a, dyn WasiFile>, Error>;
|
||||
}
|
||||
|
||||
impl<'a> FileEntryExt<'a> for Ref<'a, FileEntry> {
|
||||
fn get_cap(self, caps: FileCaps) -> Result<Ref<'a, dyn WasiFile>, Error> {
|
||||
self.capable_of(caps)?;
|
||||
Ok(Ref::map(self, |r| r.file.deref()))
|
||||
}
|
||||
}
|
||||
|
||||
bitflags! {
|
||||
pub struct FileCaps : u32 {
|
||||
const DATASYNC = 0b1;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#![allow(unused_variables)]
|
||||
use crate::dir::{DirCaps, DirEntry, DirFdStat, ReaddirCursor, ReaddirEntity, TableDirExt};
|
||||
use crate::file::{FdFlags, FdStat, FileCaps, FileEntry, FileType, Filestat, OFlags};
|
||||
use crate::file::{FdFlags, FdStat, FileCaps, FileEntry, FileEntryExt, FileType, Filestat, OFlags};
|
||||
use crate::sched::subscription::{RwEventFlags, SubscriptionResult};
|
||||
use crate::sched::Poll;
|
||||
use crate::{Error, WasiCtx};
|
||||
|
||||
Reference in New Issue
Block a user