mirror of https://github.com/kdl-org/kdl-rs.git
docs: add some examples (#47)
This commit is contained in:
parent
6d32700b95
commit
901fe3fd7b
|
|
@ -0,0 +1,47 @@
|
||||||
|
/// Show how to build your own diagnostics, without having to use the
|
||||||
|
/// `fancy` feature or having `main()` return `miette::Result`
|
||||||
|
use kdl::KdlDocument;
|
||||||
|
use miette::Diagnostic;
|
||||||
|
use miette::SourceSpan;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct MyError {
|
||||||
|
pub message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse(input: &str) -> Result<KdlDocument, MyError> {
|
||||||
|
let doc = input.parse::<KdlDocument>();
|
||||||
|
doc.map_err(|error| {
|
||||||
|
let source = error
|
||||||
|
.source_code()
|
||||||
|
.expect("parse errors should have source code");
|
||||||
|
let help = error.help.unwrap_or_default();
|
||||||
|
let span: SourceSpan = error.span;
|
||||||
|
let contents = source
|
||||||
|
.read_span(&span, 0, 0)
|
||||||
|
.expect("source should have span contents");
|
||||||
|
// miette uses 0 based indexes, but humans prefer 1-based
|
||||||
|
let line = contents.line() + 1;
|
||||||
|
let column = contents.column() + 1;
|
||||||
|
let message = format!(
|
||||||
|
"line {}, column {}: {}\n help: {}",
|
||||||
|
line, column, error, help
|
||||||
|
);
|
||||||
|
MyError { message }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = r#"
|
||||||
|
foo {
|
||||||
|
bar {
|
||||||
|
baz 1.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let err = parse(input).unwrap_err();
|
||||||
|
eprintln!("{}", err.message);
|
||||||
|
// Output:
|
||||||
|
// line 4, column 14: Expected valid value.
|
||||||
|
// help: Floating point numbers must be base 10, and have numbers after the decimal point.
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
// Shows how to maintain nodes sorted by value in a
|
||||||
|
// machine-generated kdl document
|
||||||
|
|
||||||
|
use kdl::{KdlDocument, KdlIdentifier, KdlNode};
|
||||||
|
|
||||||
|
fn sort_by_name(x: &KdlNode, y: &KdlNode) -> std::cmp::Ordering {
|
||||||
|
x.name().value().cmp(y.name().value())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> miette::Result<()> {
|
||||||
|
let input = r#"
|
||||||
|
words {
|
||||||
|
apple // one a day keeps the doctor away
|
||||||
|
orange
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let mut doc: KdlDocument = input.parse()?;
|
||||||
|
|
||||||
|
let words_section = doc.get_mut("words").expect("'words' section should exist");
|
||||||
|
let children = words_section
|
||||||
|
.children_mut()
|
||||||
|
.as_mut()
|
||||||
|
.expect("'words' section should have children");
|
||||||
|
let word_nodes = children.nodes_mut();
|
||||||
|
|
||||||
|
let identifier = KdlIdentifier::from("banana");
|
||||||
|
let word_node = KdlNode::new(identifier);
|
||||||
|
word_nodes.push(word_node);
|
||||||
|
word_nodes.sort_by(sort_by_name);
|
||||||
|
words_section.fmt();
|
||||||
|
|
||||||
|
println!("{}", doc.to_string());
|
||||||
|
|
||||||
|
// output:
|
||||||
|
// words {
|
||||||
|
// apple // one a day keeps the doctor away
|
||||||
|
// banana
|
||||||
|
// orange
|
||||||
|
// }
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue