1bcab3026Sopenharmony_ci[](https://github.com/nvzqz/static-assertions-rs) 2bcab3026Sopenharmony_ci 3bcab3026Sopenharmony_ci<div align="center"> 4bcab3026Sopenharmony_ci <a href="https://crates.io/crates/static_assertions"> 5bcab3026Sopenharmony_ci <img src="https://img.shields.io/crates/v/static_assertions.svg" alt="Crates.io"> 6bcab3026Sopenharmony_ci <img src="https://img.shields.io/crates/d/static_assertions.svg" alt="Downloads"> 7bcab3026Sopenharmony_ci </a> 8bcab3026Sopenharmony_ci <a href="https://travis-ci.org/nvzqz/static-assertions-rs"> 9bcab3026Sopenharmony_ci <img src="https://travis-ci.org/nvzqz/static-assertions-rs.svg?branch=master" alt="Build Status"> 10bcab3026Sopenharmony_ci </a> 11bcab3026Sopenharmony_ci <img src="https://img.shields.io/badge/rustc-^1.37.0-blue.svg" alt="rustc ^1.37.0"> 12bcab3026Sopenharmony_ci <br> 13bcab3026Sopenharmony_ci <a href="https://www.patreon.com/nvzqz"> 14bcab3026Sopenharmony_ci <img src="https://c5.patreon.com/external/logo/become_a_patron_button.png" alt="Become a Patron!" height="35"> 15bcab3026Sopenharmony_ci </a> 16bcab3026Sopenharmony_ci <a href="https://www.paypal.me/nvzqz"> 17bcab3026Sopenharmony_ci <img src="https://buymecoffee.intm.org/img/button-paypal-white.png" alt="Buy me a coffee" height="35"> 18bcab3026Sopenharmony_ci </a> 19bcab3026Sopenharmony_ci</div> 20bcab3026Sopenharmony_ci 21bcab3026Sopenharmony_ciCompile-time assertions for Rust, brought to you by 22bcab3026Sopenharmony_ci[Nikolai Vazquez](https://twitter.com/NikolaiVazquez). 23bcab3026Sopenharmony_ci 24bcab3026Sopenharmony_ciThis library lets you ensure correct assumptions about constants, types, and 25bcab3026Sopenharmony_cimore. See the [docs] and [FAQ](#faq) for more info! 26bcab3026Sopenharmony_ci 27bcab3026Sopenharmony_ci## Installation 28bcab3026Sopenharmony_ci 29bcab3026Sopenharmony_ciThis crate is available 30bcab3026Sopenharmony_ci[on crates.io](https://crates.io/crates/static_assertions) and can be used by 31bcab3026Sopenharmony_ciadding the following to your project's 32bcab3026Sopenharmony_ci[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html): 33bcab3026Sopenharmony_ci 34bcab3026Sopenharmony_ci```toml 35bcab3026Sopenharmony_ci[dependencies] 36bcab3026Sopenharmony_cistatic_assertions = "1.1.0" 37bcab3026Sopenharmony_ci``` 38bcab3026Sopenharmony_ci 39bcab3026Sopenharmony_ciand this to your crate root (`main.rs` or `lib.rs`): 40bcab3026Sopenharmony_ci 41bcab3026Sopenharmony_ci```rust 42bcab3026Sopenharmony_ci#[macro_use] 43bcab3026Sopenharmony_ciextern crate static_assertions; 44bcab3026Sopenharmony_ci``` 45bcab3026Sopenharmony_ci 46bcab3026Sopenharmony_ci## Usage 47bcab3026Sopenharmony_ci 48bcab3026Sopenharmony_ciThis crate exposes the following macros: 49bcab3026Sopenharmony_ci- [`assert_cfg!`] 50bcab3026Sopenharmony_ci- [`assert_eq_align!`] 51bcab3026Sopenharmony_ci- [`assert_eq_size!`] 52bcab3026Sopenharmony_ci- [`assert_eq_size_ptr!`] 53bcab3026Sopenharmony_ci- [`assert_eq_size_val!`] 54bcab3026Sopenharmony_ci- [`assert_fields!`] 55bcab3026Sopenharmony_ci- [`assert_impl_all!`] 56bcab3026Sopenharmony_ci- [`assert_impl_any!`] 57bcab3026Sopenharmony_ci- [`assert_impl_one!`] 58bcab3026Sopenharmony_ci- [`assert_not_impl_all!`] 59bcab3026Sopenharmony_ci- [`assert_not_impl_any!`] 60bcab3026Sopenharmony_ci- [`assert_obj_safe!`] 61bcab3026Sopenharmony_ci- [`assert_trait_sub_all!`] 62bcab3026Sopenharmony_ci- [`assert_trait_super_all!`] 63bcab3026Sopenharmony_ci- [`assert_type_eq_all!`] 64bcab3026Sopenharmony_ci- [`assert_type_ne_all!`] 65bcab3026Sopenharmony_ci- [`const_assert!`] 66bcab3026Sopenharmony_ci- [`const_assert_eq!`] 67bcab3026Sopenharmony_ci- [`const_assert_ne!`] 68bcab3026Sopenharmony_ci 69bcab3026Sopenharmony_ci## FAQ 70bcab3026Sopenharmony_ci 71bcab3026Sopenharmony_ci- **Q:** When would I want to use this? 72bcab3026Sopenharmony_ci 73bcab3026Sopenharmony_ci **A:** This library is useful for when wanting to ensure properties of 74bcab3026Sopenharmony_ci constants, types, and traits. 75bcab3026Sopenharmony_ci 76bcab3026Sopenharmony_ci Basic examples: 77bcab3026Sopenharmony_ci 78bcab3026Sopenharmony_ci - With the release of 1.39, `str::len` can be called in a `const` 79bcab3026Sopenharmony_ci context. Using [`const_assert!`], one can check that a string generated from 80bcab3026Sopenharmony_ci elsewhere is of a given size: 81bcab3026Sopenharmony_ci 82bcab3026Sopenharmony_ci ```rust 83bcab3026Sopenharmony_ci const DATA: &str = include_str!("path/to/string.txt"); 84bcab3026Sopenharmony_ci 85bcab3026Sopenharmony_ci const_assert!(DATA.len() < 512); 86bcab3026Sopenharmony_ci ``` 87bcab3026Sopenharmony_ci 88bcab3026Sopenharmony_ci - Have a type that absolutely must implement certain traits? With 89bcab3026Sopenharmony_ci [`assert_impl_all!`], one can ensure this: 90bcab3026Sopenharmony_ci 91bcab3026Sopenharmony_ci ```rust 92bcab3026Sopenharmony_ci struct Foo { 93bcab3026Sopenharmony_ci value: // ... 94bcab3026Sopenharmony_ci } 95bcab3026Sopenharmony_ci 96bcab3026Sopenharmony_ci assert_impl_all!(Foo: Send, Sync); 97bcab3026Sopenharmony_ci ``` 98bcab3026Sopenharmony_ci 99bcab3026Sopenharmony_ci- **Q:** How can I contribute? 100bcab3026Sopenharmony_ci 101bcab3026Sopenharmony_ci **A:** A couple of ways! You can: 102bcab3026Sopenharmony_ci 103bcab3026Sopenharmony_ci - Attempt coming up with some form of static analysis that you'd like to see 104bcab3026Sopenharmony_ci implemented. Create a [new issue] and describe how you'd imagine your 105bcab3026Sopenharmony_ci assertion to work, with example code to demonstrate. 106bcab3026Sopenharmony_ci 107bcab3026Sopenharmony_ci - Implement your own static assertion and create a [pull request]. 108bcab3026Sopenharmony_ci 109bcab3026Sopenharmony_ci - Give feedback. What are some pain points? Where is it unpleasant? 110bcab3026Sopenharmony_ci 111bcab3026Sopenharmony_ci - Write docs. If you're familiar with how this library works, sharing your 112bcab3026Sopenharmony_ci knowledge with the rest its users would be great! 113bcab3026Sopenharmony_ci 114bcab3026Sopenharmony_ci- **Q:** Will this affect my compiled binary? 115bcab3026Sopenharmony_ci 116bcab3026Sopenharmony_ci **A:** Nope! There is zero runtime cost to using this because all checks are 117bcab3026Sopenharmony_ci at compile-time, and so no code is emitted to run. 118bcab3026Sopenharmony_ci 119bcab3026Sopenharmony_ci- **Q:** Will this affect my compile times? 120bcab3026Sopenharmony_ci 121bcab3026Sopenharmony_ci **A:** Likely not by anything perceivable. If this is a concern, this library 122bcab3026Sopenharmony_ci can be put in `dev-dependencies`: 123bcab3026Sopenharmony_ci 124bcab3026Sopenharmony_ci ```toml 125bcab3026Sopenharmony_ci [dev-dependencies] 126bcab3026Sopenharmony_ci static_assertions = "1.1.0" 127bcab3026Sopenharmony_ci ``` 128bcab3026Sopenharmony_ci 129bcab3026Sopenharmony_ci and then assertions can be conditionally run behind `#[cfg(test)]`: 130bcab3026Sopenharmony_ci 131bcab3026Sopenharmony_ci ```rust 132bcab3026Sopenharmony_ci #[cfg(test)] 133bcab3026Sopenharmony_ci const_assert_eq!(MEANING_OF_LIFE, 42); 134bcab3026Sopenharmony_ci ``` 135bcab3026Sopenharmony_ci 136bcab3026Sopenharmony_ci However, the assertions will only be checked when running `cargo test`. This 137bcab3026Sopenharmony_ci somewhat defeats the purpose of catching false static conditions up-front with 138bcab3026Sopenharmony_ci a compilation failure. 139bcab3026Sopenharmony_ci 140bcab3026Sopenharmony_ci- **Q:** What is `const _`? 141bcab3026Sopenharmony_ci 142bcab3026Sopenharmony_ci **A:** It's a way of creating an unnamed constant. This is used so that macros 143bcab3026Sopenharmony_ci can be called from a global scope without requiring a scope-unique label. This 144bcab3026Sopenharmony_ci library makes use of the side effects of evaluating the `const` expression. 145bcab3026Sopenharmony_ci See the feature's 146bcab3026Sopenharmony_ci [tracking issue](https://github.com/rust-lang/rust/issues/54912) 147bcab3026Sopenharmony_ci and 148bcab3026Sopenharmony_ci [issue #1](https://github.com/nvzqz/static-assertions-rs/issues/1) 149bcab3026Sopenharmony_ci for more info. 150bcab3026Sopenharmony_ci 151bcab3026Sopenharmony_ci## Changes 152bcab3026Sopenharmony_ci 153bcab3026Sopenharmony_ciSee [`CHANGELOG.md`](https://github.com/nvzqz/static-assertions-rs/blob/master/CHANGELOG.md) 154bcab3026Sopenharmony_cifor a complete list of what has changed from one version to another. 155bcab3026Sopenharmony_ci 156bcab3026Sopenharmony_ci## License 157bcab3026Sopenharmony_ci 158bcab3026Sopenharmony_ciThis project is released under either: 159bcab3026Sopenharmony_ci 160bcab3026Sopenharmony_ci- [MIT License](https://github.com/nvzqz/static-assertions-rs/blob/master/LICENSE-MIT) 161bcab3026Sopenharmony_ci 162bcab3026Sopenharmony_ci- [Apache License (Version 2.0)](https://github.com/nvzqz/static-assertions-rs/blob/master/LICENSE-APACHE) 163bcab3026Sopenharmony_ci 164bcab3026Sopenharmony_ciat your choosing. 165bcab3026Sopenharmony_ci 166bcab3026Sopenharmony_ci[new issue]: https://github.com/nvzqz/static-assertions-rs/issues/new 167bcab3026Sopenharmony_ci[pull request]: https://github.com/nvzqz/static-assertions-rs/pulls 168bcab3026Sopenharmony_ci[docs]: https://docs.rs/static_assertions 169bcab3026Sopenharmony_ci 170bcab3026Sopenharmony_ci[`assert_cfg!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_cfg.html 171bcab3026Sopenharmony_ci[`assert_eq_align!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_align.html 172bcab3026Sopenharmony_ci[`assert_eq_size!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_size.html 173bcab3026Sopenharmony_ci[`assert_eq_size_ptr!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_size_ptr.html 174bcab3026Sopenharmony_ci[`assert_eq_size_val!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_size_val.html 175bcab3026Sopenharmony_ci[`assert_fields!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_fields.html 176bcab3026Sopenharmony_ci[`assert_impl_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_impl_all.html 177bcab3026Sopenharmony_ci[`assert_impl_any!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_impl_any.html 178bcab3026Sopenharmony_ci[`assert_impl_one!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_impl_one.html 179bcab3026Sopenharmony_ci[`assert_not_impl_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_not_impl_all.html 180bcab3026Sopenharmony_ci[`assert_not_impl_any!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_not_impl_any.html 181bcab3026Sopenharmony_ci[`assert_obj_safe!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_obj_safe.html 182bcab3026Sopenharmony_ci[`assert_trait_sub_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_trait_sub_all.html 183bcab3026Sopenharmony_ci[`assert_trait_super_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_trait_super_all.html 184bcab3026Sopenharmony_ci[`assert_type_eq_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_type_eq_all.html 185bcab3026Sopenharmony_ci[`assert_type_ne_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_type_ne_all.html 186bcab3026Sopenharmony_ci[`const_assert!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.const_assert.html 187bcab3026Sopenharmony_ci[`const_assert_eq!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.const_assert_eq.html 188bcab3026Sopenharmony_ci[`const_assert_ne!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.const_assert_ne.html 189