use alloc::string::String;
use alloc::sync::Arc;
use alloc::vec::Vec;
use crate::mode::FileType;
pub struct FileTree {
pub root: Vec<FileNode>,
}
impl FileTree {
pub fn new() -> Self {
Self { root: Vec::new() }
}
pub fn add(&mut self, node: FileNode) {
self.root.push(node);
}
}
impl Default for FileTree {
fn default() -> Self {
Self::new()
}
}
pub enum FileNode {
File {
name: Arc<String>,
contents: Vec<u8>,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
},
Directory {
name: Arc<String>,
children: Vec<FileNode>,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
},
Symlink {
name: Arc<String>,
target: String,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
},
HardLink {
name: Arc<String>,
link_target: String,
},
DeviceNode {
name: Arc<String>,
device_type: FileType,
major: u32,
minor: u32,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
},
Fifo {
name: Arc<String>,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
},
}
impl FileNode {
pub fn file(name: &str, contents: Vec<u8>, permissions: u32) -> Self {
FileNode::File {
name: Arc::new(String::from(name)),
contents,
permissions,
uid: 0,
gid: 0,
mtime: 0,
}
}
pub fn file_with_owner(
name: &str,
contents: Vec<u8>,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
) -> Self {
FileNode::File {
name: Arc::new(String::from(name)),
contents,
permissions,
uid,
gid,
mtime,
}
}
pub fn dir(name: &str, children: Vec<FileNode>, permissions: u32) -> Self {
FileNode::Directory {
name: Arc::new(String::from(name)),
children,
permissions,
uid: 0,
gid: 0,
mtime: 0,
}
}
pub fn dir_with_owner(
name: &str,
children: Vec<FileNode>,
permissions: u32,
uid: u32,
gid: u32,
mtime: u32,
) -> Self {
FileNode::Directory {
name: Arc::new(String::from(name)),
children,
permissions,
uid,
gid,
mtime,
}
}
pub fn symlink(name: &str, target: &str) -> Self {
FileNode::Symlink {
name: Arc::new(String::from(name)),
target: String::from(target),
permissions: 0o777,
uid: 0,
gid: 0,
mtime: 0,
}
}
pub fn hard_link(name: &str, link_target: &str) -> Self {
FileNode::HardLink {
name: Arc::new(String::from(name)),
link_target: String::from(link_target),
}
}
pub fn device(
name: &str,
device_type: FileType,
major: u32,
minor: u32,
permissions: u32,
) -> Self {
FileNode::DeviceNode {
name: Arc::new(String::from(name)),
device_type,
major,
minor,
permissions,
uid: 0,
gid: 0,
mtime: 0,
}
}
pub fn fifo(name: &str, permissions: u32) -> Self {
FileNode::Fifo {
name: Arc::new(String::from(name)),
permissions,
uid: 0,
gid: 0,
mtime: 0,
}
}
pub fn node_name(&self) -> &str {
match self {
FileNode::File { name, .. }
| FileNode::Directory { name, .. }
| FileNode::Symlink { name, .. }
| FileNode::HardLink { name, .. }
| FileNode::DeviceNode { name, .. }
| FileNode::Fifo { name, .. } => name,
}
}
}