fortify 0.4.1

A simple and convenient way to bundle owned data with a borrowing type
Documentation
#![allow(dead_code)]
use fortify::*;
use std::collections::HashMap;

pub struct User {
    pub name: String,
    pub data: u32,
    // ...
}

pub struct Config(Fortify<ConfigInner<'static>>);

#[derive(Lower)]
struct ConfigInner<'a> {
    pub users: &'a Vec<User>,
    pub map: HashMap<&'a str, &'a User>,
}

impl Config {
    pub fn new(users: Vec<User>) -> Self {
        fn build_map<'a>(users: &'a Vec<User>) -> HashMap<&'a str, &'a User> {
            let mut map = HashMap::new();
            for user in users.iter() {
                map.insert(user.name.as_str(), user);
            }
            map
        }
        Config(fortify! {
            let users = users;
            yield ConfigInner {
                users: &users,
                map: build_map(&users)
            };
        })
    }

    pub fn get_user_by_name(&self, name: &str) -> Option<&User> {
        self.0.borrow().map.get(name).copied()
    }
}

#[test]
fn test() {
    let config = Config::new(vec![
        User {
            name: "Alice".to_string(),
            data: 24,
        },
        User {
            name: "Bob".to_string(),
            data: 30,
        },
    ]);
    assert!(config.get_user_by_name("Alice").unwrap().data == 24);
    assert!(config.get_user_by_name("Bob").unwrap().data == 30);
    assert!(config.get_user_by_name("Charlie").is_none());
}