qmi 0.2.0

An extension of HECS that adds easy entity saving using Persy, and mutation/interaction semantics.
Documentation
use qmi::Qmi;
use tempfile::tempdir;

#[test]
fn save_load_single_entity() {
    let dir = tempdir().unwrap();
    {
        let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
        qmi.spawn(("Hello".to_string(), 10, Some(20)));
        qmi.save::<String>().unwrap();
        qmi.save::<i32>().unwrap();
        qmi.save::<Option<i32>>().unwrap();
    }
    {
        let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
        qmi.load::<String>().unwrap();
        qmi.load::<i32>().unwrap();
        qmi.load::<Option<i32>>().unwrap();
        for (text, number, some_number) in qmi.world.query::<(&String, &i32, &Option<i32>)>().iter()
        {
            assert_eq!(text, &"Hello".to_string());
            assert_eq!(number, &10);
            assert_eq!(some_number, &Some(20));
        }
        assert_eq!(qmi.world.len(), 1);
    }
}

#[test]
fn save_load_multiple_entities() {
    let dir = tempdir().unwrap();
    {
        let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
        qmi.spawn(("hello".to_string(), 10, 5.2));
        qmi.spawn((10, 5.2));
        qmi.spawn(("hello".to_string(), 5.2));
        qmi.save::<String>().unwrap();
        qmi.save::<i32>().unwrap();
        qmi.save::<f32>().unwrap();
    }
    {
        let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
        qmi.load::<String>().unwrap();
        qmi.load::<i32>().unwrap();
        qmi.load::<f32>().unwrap();
        assert_eq!(qmi.world.len(), 3);
    }
}

#[test]
fn spawn_after_load_does_not_collide() {
    let dir = tempdir().unwrap();
    let db_path = dir.path().join("test.persy");

    {
        let mut qmi = Qmi::new(&db_path).unwrap();
        qmi.spawn(("Loaded Entity".to_string(), 100));
        qmi.save::<String>().unwrap();
        qmi.save::<i32>().unwrap();
    }

    {
        let mut qmi = Qmi::new(&db_path).unwrap();
        qmi.load::<String>().unwrap();
        qmi.load::<i32>().unwrap();
        qmi.spawn(("New Entity".to_string(), 200));
        assert_eq!(qmi.world.len(), 2);
        let mut names: Vec<String> = qmi.world.query::<&String>().iter().cloned().collect();
        names.sort();
        assert_eq!(
            names,
            vec!["Loaded Entity".to_string(), "New Entity".to_string()]
        );
    }
}