i guess this is a way to do refs

This commit is contained in:
Pat Hickey
2021-01-13 14:23:59 -08:00
parent 8298ce9e4d
commit 7beb52a2bc
2 changed files with 18 additions and 9 deletions

View File

@@ -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.caps = caps;
Ok(())
} else {
Err(Error::NotCapable)
}
self.capable_of(caps)?;
self.caps = caps;
Ok(())
}
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;

View File

@@ -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};