Skip to content

Commit

Permalink
Move lib docs to README
Browse files Browse the repository at this point in the history
  • Loading branch information
Jake-Shadle committed Feb 4, 2022
1 parent 10b06ca commit 3fffc47
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 136 deletions.
127 changes: 64 additions & 63 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,72 +20,73 @@

## Usage

`cfg-expr` is a crate that can be used to parse and evaluate Rust `cfg()` expressions, both as declarable in Rust code itself, as well in cargo manifests' `[target.'cfg()'.dependencies]` sections.

It contains a list of all builtin targets known to rustc as of `1.58.0` that can be used to determine if a particular cfg expression is satisfiable.

```rust
use cfg_expr::{targets::get_builtin_target_by_triple, Expression, Predicate};

fn main() {
let specific = Expression::parse(
r#"all(
target_os = "windows",
target_arch = "x86",
windows,
target_env = "msvc",
target_feature = "fxsr",
target_feature = "sse",
target_feature = "sse2",
target_pointer_width = "32",
target_endian = "little",
not(target_vendor = "uwp"),
feature = "cool_thing",
)"#,
)
.unwrap();

// cfg_expr includes a list of every builtin target in rustc (as of 1.41)
let x86_win = get_builtin_target_by_triple("i686-pc-windows-msvc").unwrap();
let x86_pentium_win = get_builtin_target_by_triple("i586-pc-windows-msvc").unwrap();
let uwp_win = get_builtin_target_by_triple("i686-uwp-windows-msvc").unwrap();
let mac = get_builtin_target_by_triple("x86_64-apple-darwin").unwrap();

let avail_targ_feats = ["fxsr", "sse", "sse2"];

// This will satisfy all requirements
assert!(specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(x86_win),
Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
Predicate::Feature(feat) => *feat == "cool_thing",
_ => false,
}
}));

// This won't, it doesnt' have the cool_thing feature!
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(x86_pentium_win),
Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
_ => false,
}
}));

// This will *not* satisfy the vendor predicate
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(uwp_win),
Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
_ => false,
}
}));

// This will *not* satisfy the vendor, os, or env predicates
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(mac),
Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
_ => false,
}
}));
}
let specific = Expression::parse(
r#"all(
target_os = "windows",
target_arch = "x86",
windows,
target_env = "msvc",
target_feature = "fxsr",
target_feature = "sse",
target_feature = "sse2",
target_pointer_width = "32",
target_endian = "little",
not(target_vendor = "uwp"),
feature = "cool_thing",
)"#,
).unwrap();

// cfg_expr includes a list of every builtin target in rustc
let x86_win = get_builtin_target_by_triple("i686-pc-windows-msvc").unwrap();
let x86_pentium_win = get_builtin_target_by_triple("i586-pc-windows-msvc").unwrap();
let uwp_win = get_builtin_target_by_triple("i686-uwp-windows-msvc").unwrap();
let mac = get_builtin_target_by_triple("x86_64-apple-darwin").unwrap();

let avail_target_feats = ["fxsr", "sse", "sse2"];

// This will satisfy all requirements
assert!(specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(x86_win),
Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),
Predicate::Feature(feat) => *feat == "cool_thing",
_ => false,
}
}));

// This won't, it doesn't have the cool_thing feature!
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(x86_pentium_win),
Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),
_ => false,
}
}));

// This will *not* satisfy the vendor predicate
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(uwp_win),
Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),
_ => false,
}
}));

// This will *not* satisfy the vendor, os, or env predicates
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(mac),
Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),
_ => false,
}
}));
```

## Contributing
Expand Down
74 changes: 1 addition & 73 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![doc = include_str!("../README.md")]
// BEGIN - Embark standard lints v5 for Rust 1.55+
// do not change or add/remove here, but one can add exceptions after this section
// for more info see: <https://github.com/EmbarkStudios/rust-ecosystem/issues/59>
Expand Down Expand Up @@ -81,79 +82,6 @@
// crate-specific exceptions:
#![allow(clippy::single_match_else)]

//! cfg-expr is a crate that can be used to parse and evaluate Rust `cfg()`
//! expressions, both as declarable in Rust code itself, as well in cargo
//! manifests' `[target.'cfg()'.dependencies]` sections.
//!
//! It contains a list of all builtin targets known to rustc as of `1.54.0` that
//! can be used to determine if a particular cfg expression is satisfiable.
//!
//! ```
//! use cfg_expr::{targets::get_builtin_target_by_triple, Expression, Predicate};
//!
//! let specific = Expression::parse(
//! r#"all(
//! target_os = "windows",
//! target_arch = "x86",
//! windows,
//! target_env = "msvc",
//! target_feature = "fxsr",
//! target_feature = "sse",
//! target_feature = "sse2",
//! target_pointer_width = "32",
//! target_endian = "little",
//! not(target_vendor = "uwp"),
//! feature = "cool_thing",
//! )"#,
//! )
//! .unwrap();
//!
//! // cfg_expr includes a list of every builtin target in rustc
//! let x86_win = get_builtin_target_by_triple("i686-pc-windows-msvc").unwrap();
//! let x86_pentium_win = get_builtin_target_by_triple("i586-pc-windows-msvc").unwrap();
//! let uwp_win = get_builtin_target_by_triple("i686-uwp-windows-msvc").unwrap();
//! let mac = get_builtin_target_by_triple("x86_64-apple-darwin").unwrap();
//!
//! let avail_targ_feats = ["fxsr", "sse", "sse2"];
//!
//! // This will satisfy all requirements
//! assert!(specific.eval(|pred| {
//! match pred {
//! Predicate::Target(tp) => tp.matches(x86_win),
//! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
//! Predicate::Feature(feat) => *feat == "cool_thing",
//! _ => false,
//! }
//! }));
//!
//! // This won't, it doesnt' have the cool_thing feature!
//! assert!(!specific.eval(|pred| {
//! match pred {
//! Predicate::Target(tp) => tp.matches(x86_pentium_win),
//! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
//! _ => false,
//! }
//! }));
//!
//! // This will *not* satisfy the vendor predicate
//! assert!(!specific.eval(|pred| {
//! match pred {
//! Predicate::Target(tp) => tp.matches(uwp_win),
//! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
//! _ => false,
//! }
//! }));
//!
//! // This will *not* satisfy the vendor, os, or env predicates
//! assert!(!specific.eval(|pred| {
//! match pred {
//! Predicate::Target(tp) => tp.matches(mac),
//! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
//! _ => false,
//! }
//! }));
//! ```
/// Types related to parse errors
pub mod error;
/// Types related to cfg expressions
Expand Down

0 comments on commit 3fffc47

Please sign in to comment.