A parser for the Valve map format written in Rust. Also a provided convience macro for iterating over subblocks using the traversal crate.
Read more about the vmf format on Valve Developer Community
vmf
// This is a comment.
ClassName_1
{
\"Property_1\" \"Value_1\"
\"Property_2\" \"Value_2\"
ClassName_2
{
\"Property_1\" \"Value_1\"
}
ClassName_3
{
}
}
```rust use vmfparsernom::ast::{Block}; use vmfparsernom::parse; use vmfparsernom::{VerboseError, SimpleError, ErrorKind};
let input = "ClassName1 { \t\"Property1\" \"Value1\" \t\"Property2\" \"Value2\" \tClassName2 \t{ \t\t\"Property1\" \"Value1\" \t} \tClassName_3 \t{ \t} }";
// parse the input to a vmf, borrowing from input let vmf = parse::<&str, ()>(input).unwrap(); let string = vmf.tostring(); println!("vmf {vmf}") asserteq!(input, string);
// parse to owned strings instead
let vmf_owned = parse:: // All valid error types
let invalidinput = "block{\"propertywithnovalue\"}";
let errverbose = parse::<&str, VerboseError<_>>(invalidinput).unwraperr();
let errsimple = parse::<&str, SimpleError<_>>(invalidinput).unwraperr();
let errtuple = parse::<&str, (, ErrorKind)>(invalidinput).unwraperr();
let errunit = parse::<&str, ()>(invalidinput).unwrap_err(); println!("verbose: {errverbose:?}");
println!("simple: {errsimple:?}");
println!("tuple: {errtuple:?}");
println!("unit: {errunit:?}"); // implements Deref
let block: &Block // inner value is simply a block with no properties
asserteq!(vmfowned.inner.name, "root");
asserteq!(vmfowned.inner.props, vec![]);
assert!(!vmfowned.inner.blocks.isempty());
```