use super::LockState;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StatInfo {
pub mode: u32,
pub size: u64,
pub mtime: i64,
pub ctime: i64,
pub dev: u64,
pub ino: u64,
}
impl StatInfo {
pub fn is_file(&self) -> bool {
self.mode & 0o170000 == 0o100000
}
pub fn is_dir(&self) -> bool {
self.mode & 0o170000 == 0o040000
}
pub fn is_symlink(&self) -> bool {
self.mode & 0o170000 == 0o120000
}
}
#[derive(Debug, Clone)]
pub struct DirEntryInfo {
pub basename: Vec<u8>,
pub kind: Option<crate::osutils::Kind>,
pub stat: StatInfo,
pub abspath: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TransportError {
NotFound(String),
LockContention(String),
NotLocked,
AlreadyLocked,
Io {
kind: std::io::ErrorKind,
message: String,
},
Other(String),
}
impl From<std::io::Error> for TransportError {
fn from(e: std::io::Error) -> Self {
if e.kind() == std::io::ErrorKind::NotFound {
TransportError::NotFound(e.to_string())
} else {
TransportError::Io {
kind: e.kind(),
message: e.to_string(),
}
}
}
}
impl std::fmt::Display for TransportError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TransportError::NotFound(p) => write!(f, "No such file: {}", p),
TransportError::LockContention(p) => write!(f, "Lock contention: {}", p),
TransportError::NotLocked => write!(f, "Transport is not locked"),
TransportError::AlreadyLocked => write!(f, "Transport is already locked"),
TransportError::Io { kind, message } => {
write!(f, "I/O error ({:?}): {}", kind, message)
}
TransportError::Other(s) => write!(f, "Transport error: {}", s),
}
}
}
impl std::error::Error for TransportError {}
pub trait Transport {
fn exists(&self) -> Result<bool, TransportError>;
fn lock_read(&mut self) -> Result<(), TransportError>;
fn lock_write(&mut self) -> Result<(), TransportError>;
fn unlock(&mut self) -> Result<(), TransportError>;
fn lock_state(&self) -> Option<LockState>;
fn read_all(&mut self) -> Result<Vec<u8>, TransportError>;
fn write_all(&mut self, bytes: &[u8]) -> Result<(), TransportError>;
fn fdatasync(&mut self) -> Result<(), TransportError>;
fn lstat(&self, abspath: &[u8]) -> Result<StatInfo, TransportError>;
fn read_link(&self, abspath: &[u8]) -> Result<Vec<u8>, TransportError>;
fn is_tree_reference_dir(&self, abspath: &[u8]) -> Result<bool, TransportError>;
fn list_dir(&self, abspath: &[u8]) -> Result<Vec<DirEntryInfo>, TransportError>;
}