2 个版本
0.1.1 | 2023年3月14日 |
---|---|
0.1.0 | 2023年3月3日 |
#387 in 游戏
在 source_map_gen 中使用
30KB
567 行
vmf_parser_nom
使用 Rust 编写的 Valve 地图格式解析器。还提供了一个便利的宏,用于使用 traversal 包迭代子块。
vmf 格式
在 Valve 开发者社区 上了解更多关于 vmf 格式的信息。
// This is a comment.
ClassName_1
{
"Property_1" "Value_1"
"Property_2" "Value_2"
ClassName_2
{
"Property_1" "Value_1"
}
ClassName_3
{
}
}
示例
use vmf_parser_nom::ast::{Block};
use vmf_parser_nom::parse;
use vmf_parser_nom::{VerboseError, SimpleError, ErrorKind};
let input = "ClassName_1
{
\t\"Property_1\" \"Value_1\"
\t\"Property_2\" \"Value_2\"
\tClassName_2
\t{
\t\t\"Property_1\" \"Value_1\"
\t}
\tClassName_3
\t{
\t}
}";
// parse the input to a vmf, borrowing from input
let vmf = parse::<&str, ()>(input).unwrap();
let string = vmf.to_string();
println!("vmf {vmf}")
assert_eq!(input, string);
// parse to owned strings instead
let vmf_owned = parse::<String, ()>(input).unwrap();
// All valid error types
let invalid_input = "block{\"property_with_no_value\"}";
let err_verbose = parse::<&str, VerboseError<_>>(invalid_input).unwrap_err();
let err_simple = parse::<&str, SimpleError<_>>(invalid_input).unwrap_err();
let err_tuple = parse::<&str, (_, ErrorKind)>(invalid_input).unwrap_err();
let err_unit = parse::<&str, ()>(invalid_input).unwrap_err();
println!("verbose: {err_verbose:?}");
println!("simple: {err_simple:?}");
println!("tuple: {err_tuple:?}");
println!("unit: {err_unit:?}");
// implements Deref
let block: &Block<String> = &vmf_owned;
assert_eq!(vmf_owned.inner, *block);
// inner value is simply a block with no properties
assert_eq!(vmf_owned.inner.name, "root");
assert_eq!(vmf_owned.inner.props, vec![]);
assert!(!vmf_owned.inner.blocks.is_empty());
依赖项
~1MB
~20K SLoC