Experiments in applying Entity-Component-System patterns to durable data storage APIs.
1use ecsdb::Component;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Serialize, Deserialize, Component)]
5struct DiaryEntry;
6#[derive(Debug, Serialize, Deserialize, Component)]
7struct Contents(String);
8#[derive(Debug, Serialize, Deserialize, Component)]
9struct Date(chrono::NaiveDate);
10
11pub fn main() -> Result<(), anyhow::Error> {
12 tracing_subscriber::fmt::init();
13
14 let db = ecsdb::Ecs::open("basic.sqlite")?;
15
16 let _entry = db
17 .new_entity()
18 .attach(DiaryEntry)
19 .attach(Contents("Lorem ipsum ...".into()))
20 .attach(Date(chrono::Utc::now().date_naive()));
21
22 use ecsdb::query::*;
23
24 println!("Total: {} entities", db.query::<()>().count());
25
26 let _ = db.query::<(
27 DiaryEntry,
28 Contents,
29 Without<Date>,
30 Or<(DiaryEntry, Contents)>,
31 )>();
32
33 for entry in db.query::<(DiaryEntry, Contents)>() {
34 println!("DiaryEntry",);
35 println!(" id:\t{}", entry.id(),);
36 println!(
37 " date:\t{}",
38 entry.component::<Date>().unwrap().0.to_string(),
39 );
40 println!(" text:\t{}", entry.component::<Contents>().unwrap().0);
41 println!()
42 }
43
44 db.close().unwrap();
45
46 Ok(())
47}