Skip to main content

crud/
crud.rs

1use serde::{Deserialize, Serialize};
2use tito::{
3    types::{
4        DBUuid, TitoEngine, TitoIndexBlockType, TitoIndexConfig, TitoIndexField,
5        TitoModelTrait,
6    },
7    TiKV, TitoError, TitoModelOptions,
8};
9
10#[derive(Debug, Clone, Serialize, Deserialize, Default)]
11struct User {
12    id: String,
13    name: String,
14    email: String,
15}
16
17impl TitoModelTrait for User {
18    fn indexes(&self) -> Vec<TitoIndexConfig> {
19        vec![TitoIndexConfig {
20            condition: true,
21            name: "by_email".to_string(),
22            fields: vec![TitoIndexField {
23                name: "email".to_string(),
24                r#type: TitoIndexBlockType::String,
25            }],
26        }]
27    }
28
29    fn table(&self) -> String {
30        "users".to_string()
31    }
32
33    fn id(&self) -> String {
34        self.id.clone()
35    }
36}
37
38#[tokio::main]
39async fn main() -> Result<(), TitoError> {
40    let tito_db = TiKV::connect(vec!["127.0.0.1:2379"]).await?;
41    let user_model = tito_db.clone().model::<User>(TitoModelOptions::default());
42
43    let user_id = DBUuid::new_v4().to_string();
44    let user = User {
45        id: user_id.clone(),
46        name: "John Doe".to_string(),
47        email: "john@example.com".to_string(),
48    };
49
50    let saved_user = tito_db
51        .transaction(|tx| {
52            let user_model = user_model.clone();
53            async move { user_model.set(user).execute(&tx).await }
54        })
55        .await?;
56
57    println!("Created user: {:?}", saved_user);
58
59    let found_user = user_model.get(&user_id).execute(None).await?;
60    println!("Found user: {:?}", found_user);
61
62    let updated_user = User {
63        id: user_id.clone(),
64        name: "John Updated".to_string(),
65        email: "john_updated@example.com".to_string(),
66    };
67
68    tito_db
69        .transaction(|tx| {
70            let user_model = user_model.clone();
71            async move { user_model.set(updated_user).execute(&tx).await }
72        })
73        .await?;
74
75    println!("User updated");
76
77    tito_db
78        .transaction(|tx| {
79            let user_model = user_model.clone();
80            async move { user_model.remove(&user_id, &tx).await }
81        })
82        .await?;
83
84    println!("User deleted");
85
86    Ok(())
87}