use derive_sql::{Sqlable, SimpleFilter, SimpleLimit};
#[derive(Debug)]
#[derive(derive_sql_sqlite::DeriveSqlite)]
#[derive_sqlite(ident = PersonSql)] #[derive_sqlite(table_name = "person_v1")] struct Person {
#[derive_sqlite(is_primary_key = true)] name: String,
#[derive_sqlite(on_insert = set_age_on_insert)] #[derive_sqlite(on_update = set_age_on_update)] age: u32,
active: bool,
}
fn set_age_on_insert() -> u32 { 33 }
fn set_age_on_update() -> u32 { 26 }
fn main() {
let conn = rusqlite::Connection::open_in_memory().unwrap();
if let Err(e) = sample(conn) {
println!("simple::attributes failed with error: {}", e);
std::process::exit(1);
}
}
fn sample(conn: rusqlite::Connection) -> Result<(), Box<dyn std::error::Error>> {
let mut db: PersonSql<_> = conn.into();
println!("Create table");
db.create_table()?;
println!("Insert person...");
let person = Person { name: "Jo".to_string(), age: 44, active: true };
let person = db.insert(person)?;
assert!(person.name.eq("Jo"));
println!("Insert person... ok");
println!("Insert person with duplicated name [primary key] fails...");
assert!(db.insert(Person { name: "Jo".to_string(), age: 32, active: true }).is_err());
println!("Insert person with duplicated name [primary key] fails... ok");
println!("Age is assigned when inserting...");
let _ = db.insert(Person { name: "Jack".to_string(), age: 20, active: true})?;
let persons: Vec<Person> = db.select(Box::new(SimpleFilter::try_from(("name", "Jack"))?.and(Box::new(SimpleLimit::try_from(1)?))))?;
assert!(persons[0].age == 33);
println!("Age is assigned when inserting... ok");
println!("Age is assigned when updating...");
db.update(Box::new(SimpleFilter::try_from(("name", "Jack"))?.and(Box::new(SimpleLimit::try_from(1)?))), Person { name: "Jack".to_string(), age: 44, active: true })?;
let persons: Vec<Person> = db.select(Box::new(SimpleFilter::try_from(("name", "Jack"))?.and(Box::new(SimpleLimit::try_from(1)?))))?;
assert!(persons[0].age == 26);
println!("Age is assigned when updating... ok");
println!("Delete table");
db.delete_table()?;
println!("Example `attributes` ran successfully");
Ok(())
}