Skip to main content

arui_core/tree/
visible.rs

1//! # 项目树可视化实现
2//! 该模块主要针对树结构实现可视化接口,而不额外封装任何导出结构
3use crate::tree::node::TreeNode;
4use crate::tree::root::ProjectTree;
5use std::fmt::{Display, Formatter};
6
7// --------------------- visible trait ---------------------
8
9/// 项目树可视化
10/// - show:列出项目基础信息
11/// - print_tree:打印整个树结构
12/// - print_node:递归打印节点
13pub trait ProjectTreeVisible {
14    fn show(&self);
15    fn print_tree(&self);
16    fn print_node(node: &TreeNode, depth: usize);
17}
18
19// --------------------- ProjectTreeVisible ---------------------
20
21impl ProjectTreeVisible for ProjectTree {
22    /// 列出项目根节点信息:
23    /// - ID: 项目根节点的唯一标识
24    /// - Valid:是否为有效树,即树结构存在于目标路径下
25    /// - Name: 项目名
26    /// - Path: 项目根路径
27    ///
28    /// # Examples
29    ///
30    /// ```rust
31    /// use arui_core::tree::root::ProjectTree;
32    /// use arui_core::tree::visible::ProjectTreeVisible;
33    /// let tree = ProjectTree::new("test", ".", None);
34    /// tree.show();
35    /// ```
36    fn show(&self) {
37        println!("Project Tree:");
38        println!("ID: {}", self.id);
39        println!("Valid: {}", self.is_valid());
40        println!("Name: {}", self.name);
41        println!("Path: {}", self.path);
42    }
43
44    /// 打印整个树结构
45    fn print_tree(&self) {
46        if let Some(ref root) = self.root {
47            Self::print_node(root, 0);
48        } else {
49            println!("Tree is empty");
50        }
51    }
52
53    /// 递归打印节点
54    fn print_node(node: &TreeNode, depth: usize) {
55        // 根据深度缩进
56        let indent = "  ".repeat(depth);
57
58        // 打印当前节点信息
59        let node_type = if node.is_dir { "DIR" } else { "FILE" };
60        println!("{}- {} [{}]", indent, node.path, node_type);
61
62        // 递归打印子节点
63        if let Some(ref children) = node.children {
64            for child in children {
65                Self::print_node(child, depth + 1);
66            }
67        }
68    }
69}
70
71impl Display for ProjectTree {
72    // TODO:优化一下
73    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
74        write!(
75            f,
76            "ProjectTree {{\n\tID: {},\n\tValid: {},\n\tName: {},\n\tPath: {}\n}}",
77            self.id,
78            self.is_valid(),
79            self.name,
80            self.path
81        )
82    }
83}
84
85#[cfg(test)]
86mod tests {
87    use crate::tree::root::ProjectTree;
88    use crate::tree::visible::ProjectTreeVisible;
89
90    #[test]
91    fn test_show_project() {
92        let name = "test".to_string();
93        let path = ".".to_string();
94        let tree = ProjectTree::new(name, path, None);
95        tree.show();
96        print!("{:}", tree);
97    }
98
99    #[test]
100    fn test_show_project_tree() {
101        let name = "test".to_string();
102        let path = "./src".to_string();
103        let mut tree = ProjectTree::new(name, path, None);
104        tree.build().expect("panic");
105        // 顺便打印一下结构看看
106        tree.print_tree();
107    }
108}