Skip to content

Commit 0fda512

Browse files
authored
feat(table): improve pretty-printing for simple tables and lists (#478)
1 parent 58e0661 commit 0fda512

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

src/table.rs

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -777,16 +777,45 @@ impl Table {
777777
let mut pairs = self.pairs::<Value, Value>().flatten().collect::<Vec<_>>();
778778
// Sort keys
779779
pairs.sort_by(|(a, _), (b, _)| a.sort_cmp(b));
780+
let is_sequence = pairs.iter().enumerate().all(|(i, (k, _))| {
781+
if let Value::Integer(n) = k {
782+
*n == (i + 1) as Integer
783+
} else {
784+
false
785+
}
786+
});
780787
if pairs.is_empty() {
781788
return write!(fmt, "{{}}");
782789
}
783790
writeln!(fmt, "{{")?;
784-
for (key, value) in pairs {
785-
write!(fmt, "{}[", " ".repeat(ident + 2))?;
786-
key.fmt_pretty(fmt, false, ident + 2, visited)?;
787-
write!(fmt, "] = ")?;
788-
value.fmt_pretty(fmt, true, ident + 2, visited)?;
789-
writeln!(fmt, ",")?;
791+
if is_sequence {
792+
// Format as list
793+
for (_, value) in pairs {
794+
write!(fmt, "{}", " ".repeat(ident + 2))?;
795+
value.fmt_pretty(fmt, true, ident + 2, visited)?;
796+
writeln!(fmt, ",")?;
797+
}
798+
} else {
799+
for (key, value) in pairs {
800+
match key {
801+
Value::String(key)
802+
if key
803+
.to_string_lossy()
804+
.chars()
805+
.all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '0'..='9' | '_')) =>
806+
{
807+
write!(fmt, "{}{}", " ".repeat(ident + 2), key.to_string_lossy())?;
808+
write!(fmt, " = ")?;
809+
}
810+
_ => {
811+
write!(fmt, "{}[", " ".repeat(ident + 2))?;
812+
key.fmt_pretty(fmt, false, ident + 2, visited)?;
813+
write!(fmt, "] = ")?;
814+
}
815+
}
816+
value.fmt_pretty(fmt, true, ident + 2, visited)?;
817+
writeln!(fmt, ",")?;
818+
}
790819
}
791820
write!(fmt, "{}}}", " ".repeat(ident))
792821
}

tests/debug.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ fn test_debug_format() -> Result<()> {
77
// Globals
88
let globals = lua.globals();
99
let dump = format!("{globals:#?}");
10-
assert!(dump.starts_with("{\n [\"_G\"] = table:"));
10+
assert!(dump.starts_with("{\n _G = table:"));
1111

1212
// TODO: Other cases
1313

tests/table.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ fn test_table_fmt() -> Result<()> {
397397
.load(
398398
r#"
399399
local t = {1, 2, 3, a = 5, b = { 6 }}
400+
t["special-<chars>"] = 10
400401
t[9.2] = 9.2
401402
t[1.99] = 1.99
402403
t[true] = true
@@ -410,7 +411,7 @@ fn test_table_fmt() -> Result<()> {
410411
// Pretty print
411412
assert_eq!(
412413
format!("{table:#?}"),
413-
"{\n [false] = false,\n [true] = true,\n [1] = 1,\n [1.99] = 1.99,\n [2] = 2,\n [3] = 3,\n [9.2] = 9.2,\n [\"a\"] = 5,\n [\"b\"] = {\n [1] = 6,\n },\n}"
414+
"{\n [false] = false,\n [true] = true,\n [1] = 1,\n [1.99] = 1.99,\n [2] = 2,\n [3] = 3,\n [9.2] = 9.2,\n a = 5,\n b = {\n 6,\n },\n [\"special-<chars>\"] = 10,\n}"
414415
);
415416

416417
Ok(())

0 commit comments

Comments
 (0)