1bcab3026Sopenharmony_ci[![Banner](https://raw.githubusercontent.com/nvzqz/static-assertions-rs/assets/Banner.png)](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