qmi 0.3.1

An extension of HECS that adds easy entity saving using Persy.
Documentation
<img width=300 src="https://codeberg.org/Stack-Syndicate/qmi/raw/assets/logo.png">

[`crates.io`](https://crates.io/crates/qmi) [`docs.rs`](https://docs.rs/qmi) [`donate`](https://ko-fi.com/stacksyndicate)

![Coverage Status](https://codeberg.org/Stack-Syndicate/qmi/badges/workflows/coverage.yaml/badge.svg?branch=main&label=Code%20Coverage&style=flat-square)

## Usage

### Quickstart

```rust
use qmi::Qmi;
use tempfile::tempdir;

pub fn main() -> anyhow::Result<()> {
    // Temporary file for the example
    let file = tempdir().unwrap();
    // `Qmi` is the ECS/DB manager object
    let mut qmi = Qmi::new(file.path().join("qmi.persy"))?;
    // Any (sized) datatype works fine as a component.
    // `Entity` is a handle that can be used to refer to that entity again later
    let entity = qmi.spawn(("hello".to_string(), 32, 5.0));
    // Entities can be queried immutably
    for (text, number) in qmi.query::<(&String, &u32)>().iter() {
        println!("Text: {}\nNumber: {}", text, number);
    }
    // It is possible to insert components after an entity has been spawned
    qmi.insert(entity, (-5,))?;
    // Entities can also be queried mutably.
    for (text, negative_number) in qmi.query_mut::<(&mut String, &i32)>() {
        println!("Text: {}\nNegative number: {}", text, negative_number);
        *text = "hello world".to_string();
        println!("Text: {}\nNegative number: {}", text, negative_number);
    }
    // Components can be loaded up one by one. They will be reassigned to the entity
    // that they belonged to, for consistency.
    qmi.save::<(String,)>()?;
    qmi.load::<(String,)>()?;
    Ok(())
}
```