#![doc = include_str!("../DOC.md")]
#[macro_use]
extern crate log;
#[cfg(feature = "async")]
mod r#async;
mod directory_cache;
mod fuserng;
mod inode_table;
mod types;
#[cfg(feature = "async")]
pub use r#async::{AsyncFilesystem, AsyncFuserNG};
#[cfg(feature = "async")]
pub mod asynchronous {
pub use crate::AsyncFilesystem as Filesystem;
pub use crate::AsyncFuserNG as FuserNG;
}
pub use crate::fuserng::*;
pub use crate::types::*;
pub use fuser::FileType;
pub use fuser::KernelConfig;
pub use fuser::MountOption;
use std::io;
use std::path::Path;
#[derive(Debug, Default)]
pub enum ThreadCount {
#[default]
Default,
NumThreads(usize),
}
impl ThreadCount {
fn value(&self) -> usize {
match self {
Self::Default => std::thread::available_parallelism().unwrap().into(),
Self::NumThreads(num_threads) => *num_threads,
}
}
}
impl From<usize> for ThreadCount {
fn from(value: usize) -> Self {
ThreadCount::NumThreads(value)
}
}
#[inline(always)]
pub fn mount<FS: fuser::Filesystem, P: AsRef<Path>>(
fs: FS,
mountpoint: P,
options: &[MountOption],
num_threads: ThreadCount,
) -> io::Result<()> {
let mut config = fuser::Config::default();
config.mount_options = options.to_vec();
let num_threads = num_threads.value();
if num_threads > 0 {
config.n_threads = Some(num_threads);
}
fuser::mount2(fs, mountpoint, &config)
}
#[inline(always)]
pub fn spawn_mount<FS: fuser::Filesystem + Send + 'static, P: AsRef<Path>>(
fs: FS,
mountpoint: P,
options: &[MountOption],
num_threads: ThreadCount,
) -> io::Result<fuser::BackgroundSession> {
let mut config = fuser::Config::default();
config.mount_options = options.to_vec();
let num_threads = num_threads.value();
if num_threads > 0 {
config.n_threads = Some(num_threads);
}
fuser::spawn_mount2(fs, mountpoint, &config)
}