use crate::{Filesystem, Result};
use std::path::{Path, PathBuf};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Mount {
resource_url: Vec<u8>,
}
impl Mount {
#[cfg(target_os = "macos")]
pub(crate) fn new(resource_url: Vec<u8>) -> Self {
Self { resource_url }
}
#[must_use]
pub fn resource_url_bytes(&self) -> &[u8] {
&self.resource_url
}
pub fn resource_url(&self) -> std::result::Result<&str, std::str::Utf8Error> {
std::str::from_utf8(&self.resource_url)
}
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum KernelCachePolicy {
None = 0,
#[default]
MetadataOnly = 1,
Read = 2,
ReadWrite = 3,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct NetworkConfiguration {
pub lazy: bool,
pub supports_local_files: bool,
pub kernel_cache_policy: KernelCachePolicy,
}
impl Default for NetworkConfiguration {
fn default() -> Self {
Self {
lazy: true,
supports_local_files: true,
kernel_cache_policy: KernelCachePolicy::MetadataOnly,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct LocalFile {
path: PathBuf,
generation: u64,
}
impl LocalFile {
#[must_use]
pub fn new(path: impl Into<PathBuf>, generation: u64) -> Self {
Self {
path: path.into(),
generation,
}
}
#[must_use]
pub fn path(&self) -> &Path {
&self.path
}
#[must_use]
pub fn generation(&self) -> u64 {
self.generation
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum NetworkFile {
Remote,
Local(LocalFile),
}
pub trait NetworkFilesystem: Filesystem {
fn network_configuration(&self) -> NetworkConfiguration {
NetworkConfiguration::default()
}
fn open_file(&self, _inode: u64, _writable: bool) -> Result<NetworkFile> {
Ok(NetworkFile::Remote)
}
fn close_file(&self, _inode: u64, _file: NetworkFile) -> Result<()> {
Ok(())
}
}