isideload-vfs 0.0.1

A virtual filesystem for isideload
Documentation
use std::sync::RwLock;
use std::io;

pub mod fs;
pub mod native;
pub mod memory;
pub mod traits;

pub use traits::*;

static GLOBAL_VFS: RwLock<Option<Box<dyn Vfs>>> = RwLock::new(None);

pub fn set_vfs(vfs: Box<dyn Vfs>) {
    *GLOBAL_VFS.write().unwrap() = Some(vfs);
}

pub(crate) fn with_vfs<F, R>(f: F) -> io::Result<R>
where
    F: FnOnce(&dyn Vfs) -> io::Result<R>,
{
    let guard = GLOBAL_VFS.read().map_err(|_| {
        io::Error::new(io::ErrorKind::Other, "VFS lock poisoned")
    })?;
    
    if let Some(vfs) = guard.as_ref() {
        f(vfs.as_ref())
    } else {
        #[cfg(not(target_arch = "wasm32"))]
        {
            let native = native::NativeVfs;
            f(&native)
        }
        #[cfg(target_arch = "wasm32")]
        {
            Err(io::Error::new(io::ErrorKind::Unsupported, "No VFS configured for WASM"))
        }
    }
}