File tree 2 files changed +47
-0
lines changed
2 files changed +47
-0
lines changed Original file line number Diff line number Diff line change @@ -822,6 +822,22 @@ pub mod iter;
822
822
/// };
823
823
/// # }
824
824
/// ```
825
+ /// Compose trees using the `@` marker:
826
+ /// ```
827
+ /// #[macro_use] extern crate ego_tree;
828
+ /// # fn main() {
829
+ /// let subtree = tree! {
830
+ /// "foo" => { "bar", "baz" }
831
+ /// };
832
+ /// let new_tree = tree! {
833
+ /// "root" => {
834
+ /// "child x",
835
+ /// "child y",
836
+ /// @ subtree,
837
+ /// }
838
+ /// };
839
+ /// # }
840
+ /// ```
825
841
#[ macro_export]
826
842
macro_rules! tree {
827
843
( @ $n: ident { } ) => { } ;
@@ -858,6 +874,13 @@ macro_rules! tree {
858
874
}
859
875
} ;
860
876
877
+ // Append subtree from expression.
878
+ ( @ $n: ident { @ $subtree: expr $( , $( $tail: tt) * ) ? } ) => { {
879
+ $n. append_subtree( $subtree) ;
880
+ $( tree!( @ $n { $( $tail) * } ) ; ) ?
881
+ } } ;
882
+
883
+
861
884
( $root: expr) => { $crate:: Tree :: new( $root) } ;
862
885
863
886
( $root: expr => $children: tt) => {
Original file line number Diff line number Diff line change @@ -163,3 +163,27 @@ fn mixed() {
163
163
164
164
assert_eq ! ( manual_tree, macro_tree) ;
165
165
}
166
+
167
+ #[ test]
168
+ fn subtree ( ) {
169
+ let subtree = tree ! {
170
+ 'x' => { 'y' => { 'z' } }
171
+ } ;
172
+ let tree = tree ! {
173
+ 'a' => {
174
+ 'b' ,
175
+ 'c' => { 'd' , 'e' } ,
176
+ @ subtree. clone( ) ,
177
+ 'f' => { @subtree } ,
178
+ }
179
+ } ;
180
+ let expected_tree = tree ! {
181
+ 'a' => {
182
+ 'b' ,
183
+ 'c' => { 'd' , 'e' } ,
184
+ 'x' => { 'y' => { 'z' } } ,
185
+ 'f' => { 'x' => { 'y' => { 'z' } } } ,
186
+ }
187
+ } ;
188
+ assert_eq ! ( tree, expected_tree) ;
189
+ }
You can’t perform that action at this time.
0 commit comments