#cfg #target #syntax #attr #expression-parser #rust

parse_cfg

解析并评估Rust的cfg(any(condition))属性语法和目标三元组

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 2018年5月20日

468解析器实现中排名

Download history 102/week @ 2024-03-13 159/week @ 2024-03-20 137/week @ 2024-03-27 122/week @ 2024-04-03 81/week @ 2024-04-10 97/week @ 2024-04-17 92/week @ 2024-04-24 124/week @ 2024-05-01 148/week @ 2024-05-08 235/week @ 2024-05-15 241/week @ 2024-05-22 268/week @ 2024-05-29 125/week @ 2024-06-05 193/week @ 2024-06-12 211/week @ 2024-06-19 148/week @ 2024-06-26

736每月下载量
6个crate中使用 (直接使用2个)

CC0-1.0 OR MIT

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