vmfparsernom

A parser for the Valve map format written in Rust. Also a provided convience macro for iterating over subblocks using the traversal crate.

Vmf Format

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 { } }

Example

```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 = &vmfowned; asserteq!(vmf_owned.inner, *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()); ```