use crate::tree::node::TreeNode;
use crate::tree::node::count::get_file_count;
use crate::tree::node::file::get_file_size;
use std::fmt::Display;
#[derive(Debug, Clone)]
pub struct NodeSummary {
pub size: u64,
pub count: u64,
pub updated_at: Option<std::time::SystemTime>,
pub suffixes: Vec<String>,
}
impl Display for NodeSummary {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"\n size: {},\n count: {},\n updated_at: {:?},\n suffixes: {:?}",
self.size, self.count, self.updated_at, self.suffixes
)
}
}
impl NodeSummary {
pub fn new() -> Self {
NodeSummary {
size: 0,
count: 0,
updated_at: None,
suffixes: Vec::new(),
}
}
pub fn update(node: &mut TreeNode) -> NodeSummary {
let mut summary = NodeSummary::new();
summary.updated_at = Some(std::time::SystemTime::now());
if !node.is_dir {
summary.size = get_file_size(&node.path).unwrap_or(0);
summary.count = get_file_count(&node.path).unwrap_or(0);
return summary;
}
if let Some(children) = &mut node.children {
for child in children {
let child_summary = NodeSummary::update(child);
child.summary = child_summary.clone();
summary.size += child_summary.size;
summary.count += child_summary.count;
}
}
summary
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::tree::node::TreeNode;
#[test]
fn test_display() {
let ns = NodeSummary::new();
println!("{}", ns);
}
#[test]
fn test_create_summary() {
let ns = NodeSummary::new();
assert_eq!(ns.size, 0);
assert_eq!(ns.count, 0);
assert_eq!(ns.updated_at, None);
assert_eq!(ns.suffixes.len(), 0);
}
#[test]
fn test_summary_with_file() {
let mut node = TreeNode::new("./tests/examples/tree/summary/test.txt", false);
node.upsert_summary();
println!("{}", node);
}
#[test]
fn test_summary_with_dir() {
let mut node = TreeNode::new("./tests/examples/tree/summary", true);
let sub_node_1 = TreeNode::new("./tests/examples/tree/summary/test.txt", false);
let sub_node_2 = TreeNode::new("./tests/examples/tree/summary/test.rs", false);
let sub_node_3 = TreeNode::new("./tests/examples/tree/summary/test.js", false);
node.children = Some(vec![sub_node_1, sub_node_2, sub_node_3]);
node.upsert_summary();
if let Some(children) = &node.children {
for child in children {
println!("{}", child.summary);
}
}
println!("{}", node);
}
}