<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)

## 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(())
}
```