mirror of https://github.com/kdl-org/kdl-rs.git
fix(parse): small parser tweaks + more tests
This commit is contained in:
parent
892bf06e69
commit
1a8eb35168
33
src/entry.rs
33
src/entry.rs
|
|
@ -155,7 +155,7 @@ impl FromStr for KdlEntry {
|
||||||
type Err = KdlError;
|
type Err = KdlError;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
parser::parse(s, parser::entry)
|
parser::parse(s, parser::entry_with_node_space)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -192,6 +192,37 @@ mod test {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parsing() -> miette::Result<()> {
|
||||||
|
let entry: KdlEntry = " \\\n (\"m\\\"eh\")0xDEADbeef\t\\\n".parse()?;
|
||||||
|
assert_eq!(
|
||||||
|
entry,
|
||||||
|
KdlEntry {
|
||||||
|
leading: Some(" \\\n ".into()),
|
||||||
|
ty: Some("\"m\\\"eh\"".parse()?),
|
||||||
|
value: KdlValue::Base16(0xdeadbeef),
|
||||||
|
value_repr: Some("0xDEADbeef".into()),
|
||||||
|
name: None,
|
||||||
|
trailing: Some("\t\\\n".into()),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let entry: KdlEntry = " \\\n (\"m\\\"eh\")\"foo\"=0xDEADbeef\t\\\n".parse()?;
|
||||||
|
assert_eq!(
|
||||||
|
entry,
|
||||||
|
KdlEntry {
|
||||||
|
leading: Some(" \\\n ".into()),
|
||||||
|
ty: Some("\"m\\\"eh\"".parse()?),
|
||||||
|
value: KdlValue::Base16(0xdeadbeef),
|
||||||
|
value_repr: Some("0xDEADbeef".into()),
|
||||||
|
name: Some("\"foo\"".parse()?),
|
||||||
|
trailing: Some("\t\\\n".into()),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn display() {
|
fn display() {
|
||||||
let entry = KdlEntry::new(KdlValue::Base10(42));
|
let entry = KdlEntry::new(KdlValue::Base10(42));
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,41 @@ impl FromStr for KdlIdentifier {
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parsing() -> miette::Result<()> {
|
||||||
|
let plain = "foo";
|
||||||
|
assert_eq!(
|
||||||
|
plain.parse::<KdlIdentifier>()?,
|
||||||
|
KdlIdentifier {
|
||||||
|
value: plain.to_string(),
|
||||||
|
repr: Some(plain.to_string()),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let quoted = "\"foo\\\"bar\"";
|
||||||
|
assert_eq!(
|
||||||
|
quoted.parse::<KdlIdentifier>()?,
|
||||||
|
KdlIdentifier {
|
||||||
|
value: "foo\"bar".to_string(),
|
||||||
|
repr: Some(quoted.to_string()),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let invalid = "123";
|
||||||
|
assert!(invalid.parse::<KdlIdentifier>().is_err());
|
||||||
|
|
||||||
|
let invalid = " space ";
|
||||||
|
assert!(invalid.parse::<KdlIdentifier>().is_err());
|
||||||
|
|
||||||
|
let invalid = "\"x";
|
||||||
|
assert!(invalid.parse::<KdlIdentifier>().is_err());
|
||||||
|
|
||||||
|
let invalid = "r#\"foo\"#";
|
||||||
|
assert!(invalid.parse::<KdlIdentifier>().is_err());
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn formatting() {
|
fn formatting() {
|
||||||
let plain = KdlIdentifier::from("foo");
|
let plain = KdlIdentifier::from("foo");
|
||||||
|
|
|
||||||
16
src/node.rs
16
src/node.rs
|
|
@ -441,7 +441,9 @@ impl KdlNode {
|
||||||
space_before_children = entry.trailing.is_none();
|
space_before_children = entry.trailing.is_none();
|
||||||
}
|
}
|
||||||
if let Some(children) = &self.children {
|
if let Some(children) = &self.children {
|
||||||
if space_before_children {
|
if let Some(before) = self.before_children() {
|
||||||
|
write!(f, "{}", before)?;
|
||||||
|
} else if space_before_children {
|
||||||
write!(f, " ")?;
|
write!(f, " ")?;
|
||||||
}
|
}
|
||||||
write!(f, "{{")?;
|
write!(f, "{{")?;
|
||||||
|
|
@ -462,6 +464,18 @@ impl KdlNode {
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parsing() -> miette::Result<()> {
|
||||||
|
let node: KdlNode = "\n\t (\"ty\")\"node\" 0xDEADbeef;\n".parse()?;
|
||||||
|
assert_eq!(node.leading(), Some("\n\t "));
|
||||||
|
assert_eq!(node.trailing(), Some(";\n"));
|
||||||
|
assert_eq!(node.ty(), Some(&"\"ty\"".parse()?));
|
||||||
|
assert_eq!(node.name(), &"\"node\"".parse()?);
|
||||||
|
assert_eq!(node.get(0), Some(&"0xDEADbeef".parse()?));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn indexing() {
|
fn indexing() {
|
||||||
let mut node = KdlNode::new("foo");
|
let mut node = KdlNode::new("foo");
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,17 @@ fn quoted_identifier(input: &str) -> IResult<&str, KdlIdentifier, KdlParseError<
|
||||||
Ok((input, ident))
|
Ok((input, ident))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn entry(input: &str) -> IResult<&str, KdlEntry, KdlParseError<&str>> {
|
pub(crate) fn entry_with_node_space(input: &str) -> IResult<&str, KdlEntry, KdlParseError<&str>> {
|
||||||
|
let (input, leading) = recognize(many0(node_space))(input)?;
|
||||||
|
let leading = if leading.is_empty() { " " } else { leading };
|
||||||
|
let (input, mut entry) = entry(input)?;
|
||||||
|
let (input, trailing) = recognize(many0(node_space))(input)?;
|
||||||
|
entry.set_leading(leading);
|
||||||
|
entry.set_trailing(trailing);
|
||||||
|
Ok((input, entry))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn entry(input: &str) -> IResult<&str, KdlEntry, KdlParseError<&str>> {
|
||||||
alt((property, argument))(input)
|
alt((property, argument))(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -109,7 +119,8 @@ fn property(input: &str) -> IResult<&str, KdlEntry, KdlParseError<&str>> {
|
||||||
let (input, (raw, value)) = context("property value", cut(value))(input)?;
|
let (input, (raw, value)) = context("property value", cut(value))(input)?;
|
||||||
let mut entry = KdlEntry::new_prop(name, value);
|
let mut entry = KdlEntry::new_prop(name, value);
|
||||||
entry.ty = ty;
|
entry.ty = ty;
|
||||||
entry.set_leading(if leading.is_empty() { " " } else { leading });
|
entry.set_leading(leading);
|
||||||
|
entry.set_trailing("");
|
||||||
entry.set_value_repr(raw);
|
entry.set_value_repr(raw);
|
||||||
Ok((input, entry))
|
Ok((input, entry))
|
||||||
}
|
}
|
||||||
|
|
@ -124,7 +135,8 @@ fn argument(input: &str) -> IResult<&str, KdlEntry, KdlParseError<&str>> {
|
||||||
}?;
|
}?;
|
||||||
let mut entry = KdlEntry::new(value);
|
let mut entry = KdlEntry::new(value);
|
||||||
entry.ty = ty;
|
entry.ty = ty;
|
||||||
entry.set_leading(if leading.is_empty() { " " } else { leading });
|
entry.set_leading(leading);
|
||||||
|
entry.set_trailing("");
|
||||||
entry.set_value_repr(raw);
|
entry.set_value_repr(raw);
|
||||||
Ok((input, entry))
|
Ok((input, entry))
|
||||||
}
|
}
|
||||||
|
|
@ -530,6 +542,7 @@ mod node_tests {
|
||||||
|
|
||||||
let mut one = KdlEntry::new(1);
|
let mut one = KdlEntry::new(1);
|
||||||
one.set_leading(" ");
|
one.set_leading(" ");
|
||||||
|
one.set_trailing("");
|
||||||
one.set_value_repr("1");
|
one.set_value_repr("1");
|
||||||
assert_eq!(entries.next(), Some(&one));
|
assert_eq!(entries.next(), Some(&one));
|
||||||
|
|
||||||
|
|
@ -537,6 +550,7 @@ mod node_tests {
|
||||||
ident.set_repr("\"bar\"");
|
ident.set_repr("\"bar\"");
|
||||||
let mut bar = KdlEntry::new_prop(ident, false);
|
let mut bar = KdlEntry::new_prop(ident, false);
|
||||||
bar.set_leading(" ");
|
bar.set_leading(" ");
|
||||||
|
bar.set_trailing("");
|
||||||
bar.set_value_repr("false");
|
bar.set_value_repr("false");
|
||||||
assert_eq!(entries.next(), Some(&bar));
|
assert_eq!(entries.next(), Some(&bar));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue