1use rustio_core::{Db, Error, Model, Row, Value};
2
3#[derive(Debug)]
4struct User {
5 id: i64,
6 name: String,
7 is_admin: bool,
8}
9
10impl Model for User {
11 const TABLE: &'static str = "users";
12 const COLUMNS: &'static [&'static str] = &["id", "name", "is_admin"];
13 const INSERT_COLUMNS: &'static [&'static str] = &["name", "is_admin"];
14
15 fn id(&self) -> i64 {
16 self.id
17 }
18
19 fn from_row(row: Row<'_>) -> Result<Self, Error> {
20 Ok(Self {
21 id: row.get_i64("id")?,
22 name: row.get_string("name")?,
23 is_admin: row.get_bool("is_admin")?,
24 })
25 }
26
27 fn insert_values(&self) -> Vec<Value> {
28 vec![self.name.clone().into(), self.is_admin.into()]
29 }
30}
31
32#[tokio::main]
33async fn main() -> Result<(), Error> {
34 let db = Db::memory().await?;
35 db.execute(
36 "CREATE TABLE users (
37 id INTEGER PRIMARY KEY AUTOINCREMENT,
38 name TEXT NOT NULL,
39 is_admin INTEGER NOT NULL
40 )",
41 )
42 .await?;
43
44 let alice_id = User {
45 id: 0,
46 name: "Alice".into(),
47 is_admin: false,
48 }
49 .create(&db)
50 .await?;
51 let bob_id = User {
52 id: 0,
53 name: "Bob".into(),
54 is_admin: true,
55 }
56 .create(&db)
57 .await?;
58 println!("created ids: alice={alice_id} bob={bob_id}");
59
60 let alice = User::find(&db, alice_id).await?.expect("alice");
61 println!("find alice: {alice:?}");
62
63 let all = User::all(&db).await?;
64 println!("all: {all:?}");
65
66 let renamed = User {
67 id: alice_id,
68 name: "Alicia".into(),
69 is_admin: false,
70 };
71 renamed.update(&db).await?;
72 let after_update = User::find(&db, alice_id).await?.unwrap();
73 println!("after update: {after_update:?}");
74
75 User::delete(&db, bob_id).await?;
76 println!("remaining after delete bob: {:?}", User::all(&db).await?);
77
78 Ok(())
79}