use crate::core::FileIdResolver;
use crate::types::FileIdType;
use fuser::BackgroundSession;
use log::{error, info};
use std::collections::HashSet;
use std::sync::Arc;
pub struct FuseSession<T: FileIdType> {
pub(crate) session: BackgroundSession,
pub(crate) resolver: Arc<T::Resolver>,
}
impl<T: FileIdType> FuseSession<T> {
pub(crate) fn new(session: BackgroundSession, resolver: Arc<T::Resolver>) -> Self {
Self { session, resolver }
}
pub fn pruner(&self) -> FusePruner<T> {
FusePruner {
resolver: self.resolver.clone(),
}
}
pub fn prune(&self, keep: &HashSet<T>) {
self.resolver.prune(keep);
}
pub fn join(self) -> std::io::Result<()> {
info!("Unmounting FUSE session and joining its worker");
match self.session.umount_and_join() {
Ok(()) => {
info!("FUSE session unmounted");
Ok(())
}
Err(err) => {
error!("Failed while unmounting the FUSE session: {}", err);
Err(err)
}
}
}
}
#[derive(Clone)]
pub struct FusePruner<T: FileIdType> {
resolver: Arc<T::Resolver>,
}
impl<T: FileIdType> FusePruner<T> {
pub fn prune(&self, keep: &HashSet<T>) {
self.resolver.prune(keep);
}
}