1 use crate::TreeBuilder;
2 
3 /// Returns the default tree for the current thread
4 ///
5 /// # Example
6 ///
7 /// ```
8 /// use debug_tree::default_tree;
9 /// default_tree().add_leaf("A new leaf");
10 /// assert_eq!("A new leaf", default_tree().peek_string());
11 /// ```
default_tree() -> TreeBuilder12 pub fn default_tree() -> TreeBuilder {
13     thread_local! {
14         static DEFAULT_BUILDER: TreeBuilder = TreeBuilder::new();
15     }
16     DEFAULT_BUILDER.with(|f| f.clone())
17 }
18 
19 /// Adds a leaf to the default tree with the given text and formatting arguments
20 ///
21 /// # Arguments
22 /// * `text...` - Formatted text arguments, as per `format!(...)`.
23 ///
24 /// # Example
25 ///
26 /// ```
27 /// #[macro_use]
28 /// use debug_tree::{default_tree, add_leaf};
29 /// fn main() {
30 ///     add_leaf!("A {} leaf", "new");
31 ///     assert_eq!("A new leaf", &default_tree().peek_string());
32 /// }
33 /// ```
34 #[macro_export]
35 macro_rules! add_leaf {
36         ($($arg:tt)*) => {
37             if $crate::default::default_tree().is_enabled() {
38                 $crate::default::default_tree().add_leaf(&format!($($arg)*))
39             }
40         };
41     }
42 
43 /// Adds the value as a leaf to the default tree.
44 ///
45 /// Returns the given `value` argument.
46 ///
47 /// # Arguments
48 /// * `value` - An expression that implements the `Display` trait.
49 ///
50 /// # Example
51 ///
52 /// ```
53 /// #[macro_use]
54 /// use debug_tree::{default_tree, add_leaf_value};
55 /// fn main() {
56 ///     let value = add_leaf_value!(10);
57 ///     assert_eq!("10", &default_tree().string());
58 ///     assert_eq!(10, value);
59 /// }
60 /// ```
61 #[macro_export]
62 macro_rules! add_leaf_value {
63     ($value:expr) => {{
64         let v = $value;
65         if $crate::default::default_tree().is_enabled() {
66             $crate::default::default_tree().add_leaf(&format!("{}", &v));
67         }
68         v
69     }};
70 }
71 
72 /// Adds a scoped branch to the default tree with the given text and formatting arguments
73 /// The branch will be exited at the end of the current block.
74 ///
75 /// # Arguments
76 /// * `text...` - Formatted text arguments, as per `format!(...)`.
77 ///
78 /// # Example
79 ///
80 /// ```
81 /// #[macro_use]
82 /// use debug_tree::{default_tree, add_branch, add_leaf};
83 /// fn main() {
84 ///     {
85 ///         add_branch!("New {}", "Branch"); // _branch enters scope
86 ///         // tree is now pointed inside new branch.
87 ///         add_leaf!("Child of {}", "Branch");
88 ///         // Block ends, so tree exits the current branch.
89 ///     }
90 ///     add_leaf!("Sibling of {}", "Branch");
91 ///     assert_eq!("\
92 /// New Branch
93 /// └╼ Child of Branch
94 /// Sibling of Branch" , &default_tree().string());
95 /// }
96 /// ```
97 #[macro_export]
98 macro_rules! add_branch {
99     () => {
100         let _debug_tree_branch = if $crate::default::default_tree().is_enabled() {
101             $crate::default::default_tree().enter_scoped()
102         } else {
103             $crate::scoped_branch::ScopedBranch::none()
104         };
105     };
106     ($($arg:tt)*) => {
107         let _debug_tree_branch = if $crate::default::default_tree().is_enabled() {
108             $crate::default::default_tree().add_branch(&format!($($arg)*))
109         } else {
110             $crate::scoped_branch::ScopedBranch::none()
111         };
112     };
113 
114 }
115 
116 #[cfg(test)]
117 mod test {
118     use crate::default_tree;
119     use crate::*;
120 
121     #[test]
unnamed_branch()122     fn unnamed_branch() {
123         add_leaf!("1");
124         add_branch!();
125         add_leaf!("1.1");
126         {
127             add_branch!();
128             add_leaf!("1.1.1");
129         }
130         add_leaf!("1.2");
131         default_tree().peek_print();
132         assert_eq!(
133             "\
134 1
135 ├╼ 1.1
136 │ └╼ 1.1.1
137 └╼ 1.2",
138             default_tree().string()
139         );
140     }
141     #[test]
named_branch()142     fn named_branch() {
143         add_branch!("11");
144         {
145             add_branch!("11.1");
146             add_leaf!("11.1.1");
147         }
148         add_leaf!("11.2");
149         default_tree().peek_print();
150         assert_eq!(
151             "\
152 11
153 ├╼ 11.1
154 │ └╼ 11.1.1
155 └╼ 11.2",
156             default_tree().string()
157         );
158     }
159 
160     #[test]
leaf_with_value()161     fn leaf_with_value() {
162         let value = add_leaf_value!(10);
163         default_tree().peek_print();
164         assert_eq!("10", default_tree().string());
165         assert_eq!(10, value);
166     }
167 }
168