polonius_the_crab::prelude

Macro polonius

Source
macro_rules! polonius {
    (
    |$var:ident $(,)?| -> $Ret:ty
        $body:block
    $(,)?
) => { ... };
}
Expand description

Convenient entry-point to this crate’s logic.

§Usage

  • use ::polonius_the_crab::prelude::*;
    
    let mut a_mut_binding: &mut _ = // …
    
    //                                      the lifetime placeholder has to be
    //                                          named `'polonius` !!
    //                                               vvvvvvvvv
    let x = polonius!(|a_mut_binding| -> SomeRetType<'polonius> {
        let some_dependent_type = stuff(a_mut_binding);
        if some_cond() {
            polonius_return!(some_dependent_type);
        }
        if some_other_cond() {
            exit_polonius!(42);
            unreachable!();
        }
        42
    });
    assert_eq!(x, 42);
    stuff(a_mut_binding) // macro gave it back
    // …

§Generic parameters

They Just Work™.

  • use ::polonius_the_crab::prelude::*;
    
    fn get_or_insert<'map, 'v, K, V : ?Sized> (
        mut map: &'map mut ::std::collections::HashMap<K, &'v V>,
        key: &'_ K,
        fallback_value: &'v V,
    ) -> &'map &'v V
    where
        K : ::core::hash::Hash + Eq + Clone,
        V : ::core::fmt::Debug,
    {
        polonius!(|map| -> &'polonius &'v V {
            if let Some(v) = map.get(key) {
                dbg!(v);
                polonius_return!(v);
            }
        });
        map.insert(key.clone(), fallback_value);
        &map[key]
    }