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}