use std::borrow::Borrow;
use std::fmt::Debug;
use serde::Serialize;
use time::OffsetDateTime;
use crate::*;
pub trait EntryTrait: Debug {
fn apath(&self) -> &Apath;
fn kind(&self) -> Kind;
fn mtime(&self) -> OffsetDateTime;
fn size(&self) -> Option<u64>;
fn symlink_target(&self) -> Option<&str>;
fn unix_mode(&self) -> UnixMode;
fn owner(&self) -> &Owner;
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
#[serde(tag = "kind")]
pub enum KindMeta {
File { size: u64 },
Dir,
Symlink { target: String },
Unknown,
}
impl From<&KindMeta> for Kind {
fn from(from: &KindMeta) -> Kind {
match from {
KindMeta::Dir => Kind::Dir,
KindMeta::File { .. } => Kind::File,
KindMeta::Symlink { .. } => Kind::Symlink,
KindMeta::Unknown => Kind::Unknown,
}
}
}
#[derive(Debug, Serialize, Clone, Eq, PartialEq)]
pub struct EntryValue {
pub(crate) apath: Apath,
#[serde(flatten)]
pub(crate) kind_meta: KindMeta,
pub(crate) mtime: OffsetDateTime,
pub(crate) unix_mode: UnixMode,
#[serde(flatten)]
pub(crate) owner: Owner,
}
impl<B: Borrow<EntryValue> + Debug> EntryTrait for B {
fn apath(&self) -> &Apath {
&self.borrow().apath
}
fn kind(&self) -> Kind {
Kind::from(&self.borrow().kind_meta)
}
fn mtime(&self) -> OffsetDateTime {
self.borrow().mtime
}
fn size(&self) -> Option<u64> {
if let KindMeta::File { size } = self.borrow().kind_meta {
Some(size)
} else {
None
}
}
fn symlink_target(&self) -> Option<&str> {
match &self.borrow().kind_meta {
KindMeta::Symlink { target } => Some(target),
_ => None,
}
}
fn unix_mode(&self) -> UnixMode {
self.borrow().unix_mode
}
fn owner(&self) -> &Owner {
&self.borrow().owner
}
}