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}