项目作者: nvzqz

项目描述 :
Ensure correct assumptions about constants, types, and more in Rust
高级语言: Rust
项目地址: git://github.com/nvzqz/static-assertions-rs.git
创建时间: 2017-08-12T18:02:22Z
项目社区:https://github.com/nvzqz/static-assertions-rs

开源协议:Other

下载


Banner

Compile-time assertions for Rust, brought to you by
Nikolai Vazquez.

This library lets you ensure correct assumptions about constants, types, and
more. See the docs and FAQ for more info!

Installation

This crate is available
on crates.io and can be used by
adding the following to your project’s
Cargo.toml:

  1. [dependencies]
  2. static_assertions = "1.1.0"

and this to your crate root (main.rs or lib.rs):

  1. #[macro_use]
  2. extern crate static_assertions;

Usage

This crate exposes the following macros:

FAQ

  • Q: When would I want to use this?

    A: This library is useful for when wanting to ensure properties of
    constants, types, and traits.

    Basic examples:

    • With the release of 1.39, str::len can be called in a const
      context. Using const_assert!, one can check that a string generated from
      elsewhere is of a given size:

      1. const DATA: &str = include_str!("path/to/string.txt");
      2. const_assert!(DATA.len() < 512);
    • Have a type that absolutely must implement certain traits? With
      assert_impl_all!, one can ensure this:

      1. struct Foo {
      2. value: // ...
      3. }
      4. assert_impl_all!(Foo: Send, Sync);
  • Q: How can I contribute?

    A: A couple of ways! You can:

    • Attempt coming up with some form of static analysis that you’d like to see
      implemented. Create a new issue and describe how you’d imagine your
      assertion to work, with example code to demonstrate.

    • Implement your own static assertion and create a pull request.

    • Give feedback. What are some pain points? Where is it unpleasant?

    • Write docs. If you’re familiar with how this library works, sharing your
      knowledge with the rest its users would be great!

  • Q: Will this affect my compiled binary?

    A: Nope! There is zero runtime cost to using this because all checks are
    at compile-time, and so no code is emitted to run.

  • Q: Will this affect my compile times?

    A: Likely not by anything perceivable. If this is a concern, this library
    can be put in dev-dependencies:

    1. [dev-dependencies]
    2. static_assertions = "1.1.0"

    and then assertions can be conditionally run behind #[cfg(test)]:

    1. #[cfg(test)]
    2. const_assert_eq!(MEANING_OF_LIFE, 42);

    However, the assertions will only be checked when running cargo test. This
    somewhat defeats the purpose of catching false static conditions up-front with
    a compilation failure.

  • Q: What is const _?

    A: It’s a way of creating an unnamed constant. This is used so that macros
    can be called from a global scope without requiring a scope-unique label. This
    library makes use of the side effects of evaluating the const expression.
    See the feature’s
    tracking issue
    and
    issue #1
    for more info.

Changes

See CHANGELOG.md
for a complete list of what has changed from one version to another.

License

This project is released under either:

at your choosing.