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}