fix(formatting): Fix formatting when decoration is not present (#56)

This commit is contained in:
Christopher Durham 2022-08-18 14:22:15 -05:00 committed by GitHub
parent bbc5e4e6a6
commit 2e9c0447f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 4 deletions

View File

@ -480,6 +480,25 @@ foo 1 bar=0xdeadbeef {
Ok(()) Ok(())
} }
#[test]
fn simple_fmt() -> miette::Result<()> {
let mut doc: KdlDocument = "a { b { c { }; }; }".parse().unwrap();
KdlDocument::fmt(&mut doc);
print!("{}", doc);
assert_eq!(
doc.to_string(),
r#"a {
b {
c {
}
}
}
"#
);
Ok(())
}
#[test] #[test]
fn parse_examples() -> miette::Result<()> { fn parse_examples() -> miette::Result<()> {
include_str!("../examples/kdl-schema.kdl").parse::<KdlDocument>()?; include_str!("../examples/kdl-schema.kdl").parse::<KdlDocument>()?;

View File

@ -1,3 +1,5 @@
use std::fmt::Write as _;
pub(crate) fn fmt_leading(leading: &mut String, indent: usize, no_comments: bool) { pub(crate) fn fmt_leading(leading: &mut String, indent: usize, no_comments: bool) {
if leading.is_empty() { if leading.is_empty() {
return; return;
@ -9,11 +11,11 @@ pub(crate) fn fmt_leading(leading: &mut String, indent: usize, no_comments: bool
for line in comments { for line in comments {
let trimmed = line.trim(); let trimmed = line.trim();
if !trimmed.is_empty() { if !trimmed.is_empty() {
result.push_str(&format!("{:indent$}{}\n", "", trimmed, indent = indent)); writeln!(result, "{:indent$}{}", "", trimmed, indent = indent).unwrap();
} }
} }
} }
result.push_str(&format!("{:indent$}", "", indent = indent)); write!(result, "{:indent$}", "", indent = indent).unwrap();
*leading = result; *leading = result;
} }

View File

@ -369,7 +369,7 @@ impl KdlNode {
} }
/// Represents a [`KdlNode`]'s entry key. /// Represents a [`KdlNode`]'s entry key.
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub enum NodeKey { pub enum NodeKey {
/// Key for a node property entry. /// Key for a node property entry.
Key(KdlIdentifier), Key(KdlIdentifier),
@ -513,7 +513,10 @@ impl KdlNode {
writeln!(f)?; writeln!(f)?;
} }
children.stringify(f, indent + 4)?; children.stringify(f, indent + 4)?;
write!(f, "{:indent$}}}", "", indent = indent)?; if children.trailing.is_none() {
write!(f, "{:indent$}", "", indent = indent)?;
}
write!(f, "}}")?;
} }
if let Some(trailing) = &self.trailing { if let Some(trailing) = &self.trailing {
write!(f, "{}", trailing)?; write!(f, "{}", trailing)?;

27
tests/formatting.rs Normal file
View File

@ -0,0 +1,27 @@
use kdl::{KdlDocument, KdlNode};
#[test]
fn build_and_format() {
let mut c = KdlNode::new("c");
c.ensure_children();
let mut b = KdlNode::new("b");
b.ensure_children().nodes_mut().push(c);
let mut a = KdlNode::new("a");
a.ensure_children().nodes_mut().push(b);
let mut doc = KdlDocument::new();
doc.nodes_mut().push(a);
doc.fmt();
let fmt = doc.to_string();
println!("{}", fmt);
assert_eq!(
fmt,
r#"a {
b {
c {
}
}
}
"#
);
}