use bitflags::bitflags;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub struct NodeId(pub usize);
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct EntryFlags: u16 {
const IS_DIR = 0b0000_0001;
const READ_ERROR = 0b0000_0010; const SUB_ERROR = 0b0000_0100; const EXCLUDED = 0b0000_1000; const OTHER_FS = 0b0001_0000; const KERNFS = 0b0010_0000; const NOT_REG = 0b0100_0000; const HARD_LINK = 0b1000_0000; const EMPTY_DIR = 0b0000_0001_0000_0000; }
}
#[derive(Debug, Clone)]
pub struct ExtendedInfo {
pub mtime: i64, pub uid: u32,
pub gid: u32,
pub mode: u32,
}
#[derive(Debug, Clone)]
pub struct TreeNode {
pub name: Box<str>,
pub asize: i64,
pub dsize: i64,
pub dev: u64,
pub ino: u64,
pub nlink: u32,
pub flags: EntryFlags,
pub extended: Option<ExtendedInfo>,
pub children: Vec<NodeId>,
pub parent: Option<NodeId>,
pub stats: crate::tree::AggregateStats,
}
impl TreeNode {
pub fn new_file(
name: String,
asize: i64,
dsize: i64,
dev: u64,
ino: u64,
nlink: u32,
flags: EntryFlags,
extended: Option<ExtendedInfo>,
) -> Self {
Self {
name: name.into_boxed_str(),
asize,
dsize,
dev,
ino,
nlink,
flags,
extended,
children: Vec::new(),
parent: None,
stats: crate::tree::AggregateStats::default(),
}
}
pub fn new_dir(
name: String,
dev: u64,
ino: u64,
flags: EntryFlags,
extended: Option<ExtendedInfo>,
) -> Self {
Self {
name: name.into_boxed_str(),
asize: 0,
dsize: 0,
dev,
ino,
nlink: 1,
flags: flags | EntryFlags::IS_DIR,
extended,
children: Vec::new(),
parent: None,
stats: crate::tree::AggregateStats::default(),
}
}
pub fn is_dir(&self) -> bool {
self.flags.contains(EntryFlags::IS_DIR)
}
}