6个稳定版本
4.1.1 | 2023年8月18日 |
---|---|
4.1.0 | 2023年8月16日 |
3.1.0 | 2023年5月1日 |
3.0.0 | 2023年3月9日 |
0.1.0 |
|
468在解析器实现中排名
736每月下载量
在6个crate中使用 (直接使用2个)
26KB
489 代码行
cfg()
表达式解析器
Cfg
是仅用于cfg()
表达式的AST。 Target
允许目标三元组或cfg()
,因此它适用于解析Cargo允许在target.🈁️.dependencies
中使用的目标。
use parse_cfg::*;
fn main() -> Result<(), ParseError> {
let cfg: Cfg = r#"cfg(any(unix, feature = "extra"))"#.parse()?;
assert_eq!(Cfg::Any(vec![
Cfg::Is("unix".into()),
Cfg::Equal("feature".into(), "extra".into()),
]), cfg);
let is_set = cfg.eval(|key, comparison| if key == "feature" && comparison == "extra" { Some(comparison) } else { None });
assert!(is_set);
let target = "powerpc64le-unknown-linux-gnu".parse()?;
assert_eq!(Target::Triple {
arch: "powerpc64le".into(),
vendor: "unknown".into(),
os: "linux".into(),
env: Some("gnu".into()),
}, target);
/// `Cfg` and `Target` types take an optional generic argument for the string type,
/// so you can parse slices without allocating `String`s, or parse into `Cow<str>`.
let target = Target::<&str>::parse_generic("powerpc64le-unknown-linux-gnu")?;
assert_eq!(Target::Triple {
arch: "powerpc64le",
vendor: "unknown",
os: "linux",
env: Some("gnu"),
}, target);
Ok(()) }
解析不可信输入是安全的。表达式深度限制为255级。
Rust使用的目标三元组不符合其文档化的语法,因此有时os
/vendor
/env
会发生变化。
依赖关系
~1MB
~20K SLoC