Skip to main content

isideload_vfs/
lib.rs

1use std::sync::RwLock;
2use std::io;
3
4pub mod fs;
5pub mod native;
6pub mod memory;
7pub mod traits;
8
9pub use traits::*;
10
11static GLOBAL_VFS: RwLock<Option<Box<dyn Vfs>>> = RwLock::new(None);
12
13pub fn set_vfs(vfs: Box<dyn Vfs>) {
14    *GLOBAL_VFS.write().unwrap() = Some(vfs);
15}
16
17pub(crate) fn with_vfs<F, R>(f: F) -> io::Result<R>
18where
19    F: FnOnce(&dyn Vfs) -> io::Result<R>,
20{
21    let guard = GLOBAL_VFS.read().map_err(|_| {
22        io::Error::new(io::ErrorKind::Other, "VFS lock poisoned")
23    })?;
24    
25    if let Some(vfs) = guard.as_ref() {
26        f(vfs.as_ref())
27    } else {
28        #[cfg(not(target_arch = "wasm32"))]
29        {
30            let native = native::NativeVfs;
31            f(&native)
32        }
33        #[cfg(target_arch = "wasm32")]
34        {
35            Err(io::Error::new(io::ErrorKind::Unsupported, "No VFS configured for WASM"))
36        }
37    }
38}