owl/examples/loan.rs
JMARyA 6c54873ca2
Some checks failed
ci/woodpecker/push/test Pipeline failed
init
2025-04-28 18:53:21 +02:00

55 lines
1.7 KiB
Rust

use owl::{db::model::person::Person, prelude::*};
#[relation("receiver", Person, "payer", Person, RelationKind::Bidirectional)]
pub struct LoanRelation {
debt: f64,
}
pub fn lend_money(who: &Model<Person>, from: &Model<Person>, amount: f64, db: &Database) {
LoanRelation { debt: amount }.add(who, from, None, db)
}
pub fn pay_off(who: &Model<Person>, to: &Model<Person>, amount: f64, db: &Database) {
let mut loan = LoanRelation::get(who, to, db).unwrap();
loan.write(db, |loan| {
loan.alter_meta(|x: &mut _| {
x.debt -= amount;
});
});
}
pub fn main() {
env_logger::init();
let db = Database::filesystem("./db");
let p = db.save(Person::new_id("myperson", "first", "last"));
let p2 = db.save(Person::new_id("secperson", "second", "last"));
let banker = db.save(Person::new_id("banker", "boss", "bank"));
lend_money(&p, &banker, 250.0, &db);
lend_money(&p2, &p, 100.0, &db);
lend_money(&p2, &banker, 150.0, &db);
let financer: Vec<_> = LoanRelation::get_payer_of(&p2, &db)
.into_iter()
.map(|x| LoanRelation::payer(&x.dereference(&db), &db))
.map(|x| x.read().first_name.current().cloned().unwrap())
.collect();
println!(
"{} is financed by {:?}",
p2.read().first_name.current().unwrap(),
financer
);
let brokers = LoanRelation::get_receiver_of(&p, &db);
dbg!(&brokers);
let brokers = dereference(&brokers, &db);
brokers.iter().for_each(|x| println!("{:?}", x.read()));
pay_off(&p2, &p, 100.0, &db);
let brokers = dereference(&LoanRelation::get_receiver_of(&p, &db), &db);
brokers.iter().for_each(|x| println!("{:?}", x.read()));
}