Skip to content

Commit dea87c4

Browse files
committed
aml: nicer Display impl for Namespace
1 parent b77079b commit dea87c4

File tree

2 files changed

+29
-15
lines changed

2 files changed

+29
-15
lines changed

aml/src/namespace.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -170,33 +170,47 @@ impl Namespace {
170170
}
171171
}
172172

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 {
176174
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 = "└── ";
178178

179179
fn print_level(
180180
namespace: &Namespace,
181181
f: &mut fmt::Formatter<'_>,
182-
level_name: &str,
183182
level: &NamespaceLevel,
184-
indent: usize,
183+
indent_stack: String,
185184
) -> 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+
}
190199
}
191200

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)?;
194207
}
195208

196209
Ok(())
197210
}
198211

199-
print_level(self, f, "\\", &self.root, 0)
212+
writeln!(f, "\n \\:")?;
213+
print_level(self, f, &self.root, String::from(" "))
200214
}
201215
}
202216

tools/aml_tester/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,14 @@ fn main() -> std::io::Result<()> {
192192
match interpreter.load_table(&contents[AML_TABLE_HEADER_LENGTH..]) {
193193
Ok(()) => {
194194
println!("{}OK{}", termion::color::Fg(termion::color::Green), termion::style::Reset);
195-
println!("Namespace: {:#?}", interpreter.namespace.lock());
195+
println!("Namespace: {}", interpreter.namespace.lock());
196196
summaries.insert((file_entry, TestResult::Pass));
197197
(passed + 1, failed)
198198
}
199199

200200
Err(err) => {
201201
println!("{}Failed ({:?}){}", termion::color::Fg(termion::color::Red), err, termion::style::Reset);
202-
println!("Namespace: {:#?}", interpreter.namespace.lock());
202+
println!("Namespace: {}", interpreter.namespace.lock());
203203
summaries.insert((file_entry, TestResult::ParseFail));
204204
(passed, failed + 1)
205205
}

0 commit comments

Comments
 (0)