bind_it

Crates.iobind_it
lib.rsbind_it
version0.1.3
sourcesrc
created_at2022-04-01 18:58:35.354318
updated_at2022-04-01 21:09:10.094123
descriptionA macro that allows impl traits in let/static/const bindings until they actually stabilized
homepage
repository
max_upload_size
id560474
size8,806
Artem S (plazmoid)

documentation

README

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?

Ez!

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.

Commit count: 0

cargo fmt