@@ -170,33 +170,47 @@ impl Namespace {
170
170
}
171
171
}
172
172
173
- // TODO: this is fairly unreadable. We should group devices better and maybe use ASCII chars to
174
- // format the tree better (maybe that should be `Display` instead idk?)
175
- impl fmt:: Debug for Namespace {
173
+ impl fmt:: Display for Namespace {
176
174
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
177
- const INDENT_PER_LEVEL : usize = 4 ;
175
+ const STEM : & str = "│ " ;
176
+ const BRANCH : & str = "├── " ;
177
+ const END : & str = "└── " ;
178
178
179
179
fn print_level (
180
180
namespace : & Namespace ,
181
181
f : & mut fmt:: Formatter < ' _ > ,
182
- level_name : & str ,
183
182
level : & NamespaceLevel ,
184
- indent : usize ,
183
+ indent_stack : String ,
185
184
) -> fmt:: Result {
186
- writeln ! ( f, "{:indent$}{}:" , "" , level_name, indent = indent) ?;
187
-
188
- for ( name, object) in level. values . iter ( ) {
189
- writeln ! ( f, "{:indent$}{}: {:?}" , "" , name. as_str( ) , object, indent = indent + INDENT_PER_LEVEL ) ?;
185
+ for ( i, ( name, object) ) in level. values . iter ( ) . enumerate ( ) {
186
+ let end = ( i == level. values . len ( ) - 1 )
187
+ && level. children . iter ( ) . filter ( |( _, l) | l. kind == NamespaceLevelKind :: Scope ) . count ( ) == 0 ;
188
+ writeln ! ( f, "{}{}{}: {:?}" , & indent_stack, if end { END } else { BRANCH } , name. as_str( ) , object) ?;
189
+
190
+ // If the object has a corresponding scope, print it here
191
+ if let Some ( child_level) = level. children . get ( & name) {
192
+ print_level (
193
+ namespace,
194
+ f,
195
+ child_level,
196
+ if end { indent_stack. clone ( ) + " " } else { indent_stack. clone ( ) + STEM } ,
197
+ ) ?;
198
+ }
190
199
}
191
200
192
- for ( name, sub_level) in level. children . iter ( ) {
193
- print_level ( namespace, f, name. as_str ( ) , sub_level, indent + INDENT_PER_LEVEL ) ?;
201
+ let remaining_scopes: Vec < _ > =
202
+ level. children . iter ( ) . filter ( |( _, l) | l. kind == NamespaceLevelKind :: Scope ) . collect ( ) ;
203
+ for ( i, ( name, sub_level) ) in remaining_scopes. iter ( ) . enumerate ( ) {
204
+ let end = i == remaining_scopes. len ( ) - 1 ;
205
+ writeln ! ( f, "{}{}{}:" , & indent_stack, if end { END } else { BRANCH } , name. as_str( ) ) ?;
206
+ print_level ( namespace, f, sub_level, indent_stack. clone ( ) + STEM ) ?;
194
207
}
195
208
196
209
Ok ( ( ) )
197
210
}
198
211
199
- print_level ( self , f, "\\ " , & self . root , 0 )
212
+ writeln ! ( f, "\n \\ :" ) ?;
213
+ print_level ( self , f, & self . root , String :: from ( " " ) )
200
214
}
201
215
}
202
216
0 commit comments