3 releases
0.1.3 | Apr 1, 2022 |
---|---|
0.1.1 | Apr 1, 2022 |
0.1.0 | Apr 1, 2022 |
#2063 in Procedural macros
7KB
104 lines
Description
A macro that allows using impl traits in bindings.
Currently supported statements: let
, const
(with some limitations mentioned below), static
.
This crate will be replaced by impl_trait_in_bindings feature in future,
but there is still a long way to reimplement and stabilize it.
Example
#![feature(type_alias_impl_trait)]
#[macro_use]
extern crate bind_it;
fn main() {
bind_it!( let x: impl std::fmt::Display = true; );
// fails, even x variable is initialized with a boolean, its type is hidden behind `Display` trait,
// and the only thing that we can do - display x
// assert!(x);
// works
println!("{x}")
}
How it works?
Minimal compiler version
rustc 1.61.0-nightly (c5cf08d37 2022-03-30)
with #![feature(type_alias_impl_trait)]
enabled
Limitations
- Currently only one item per macro supported
- Associated consts are not yet supported
- Only one type per impl Trait allowed. tl;dr, you can't write
bind_it! {
let _: impl std::fmt::Display = if rand::random() > 0.5 {
"qwe"
} else {
5u8
};
};
Despite of that fact that both &str
and u8
implement Display
trait, we need to determine ONE concrete type in the compile time.
Dependencies
~2MB
~44K SLoC