full_system/
full_system.rs

1use easy_db::{EasyClient, EasyDB};
2use serde_json::json;
3use std::collections::HashMap;
4use std::time::Duration;
5use tokio::time::sleep;
6
7#[tokio::main]
8async fn main() -> anyhow::Result<()> {
9    println!("šŸš€ --- STARTING MONOLITHIC SYSTEM DEMO --- \n");
10
11    // =====================================================
12    // PART 1: SERVER SETUP (Background Task)
13    // =====================================================
14    let port = 9900; // Using a different port for this demo
15    let db_name = "monolith_school_db";
16
17    // 1. Initialize Database
18    let mut db = EasyDB::init(db_name).expect("Failed to init DB");
19
20    // 2. Create Tables
21    db.create_table(
22        "students",
23        "id INTEGER PRIMARY KEY, name TEXT, age INTEGER, gpa REAL",
24    )?;
25    db.create_table("logs", "id INTEGER PRIMARY KEY, message TEXT, level TEXT")?;
26
27    println!("āœ… [SERVER] Tables created.");
28
29    // 3. Spawn the Server in a Background Task
30    // This ensures the server runs without blocking the main thread.
31    tokio::spawn(async move {
32        println!("āœ… [SERVER] Listening on port {}...", port);
33        if let Err(e) = db.run_server(port).await {
34            eprintln!("āŒ [SERVER] Error: {}", e);
35        }
36    });
37
38    // Give the server a moment to start up
39    sleep(Duration::from_millis(500)).await;
40
41    // =====================================================
42    // PART 2: CLIENT OPERATIONS (Main Thread)
43    // =====================================================
44    let client = EasyClient::new("localhost", port);
45    println!("\nšŸ”— [CLIENT] Connected to localhost:{}\n", port);
46
47    // --- SCENARIO 1: CREATE (POST) ---
48    println!("šŸ“ Action: Adding Students...");
49    client
50        .post(
51            "students",
52            json!({"name": "Alice Wonderland", "age": 20, "gpa": 3.8}),
53        )
54        .await?;
55    client
56        .post(
57            "students",
58            json!({"name": "Bob Builder", "age": 22, "gpa": 2.5}),
59        )
60        .await?;
61    client
62        .post(
63            "students",
64            json!({"name": "Charlie Chaplin", "age": 25, "gpa": 4.0}),
65        )
66        .await?;
67    println!("āœ… Students added.");
68
69    // --- SCENARIO 2: READ & FILTER (GET) ---
70    println!("šŸ” Action: Finding 'Bob Builder'...");
71    let mut params = HashMap::new();
72    params.insert("name", "Bob Builder");
73
74    let bob_res = client.get("students", Some(params)).await?;
75    let bob_list = bob_res.as_array().expect("Expected array");
76    let bob_id = bob_list[0]["id"].as_i64().unwrap();
77    println!("āœ… Found Bob. ID: {}", bob_id);
78
79    // --- SCENARIO 3: UPDATE (PUT) ---
80    println!("šŸ”„ Action: Updating Bob's GPA...");
81    client
82        .put(
83            "students",
84            bob_id,
85            json!({
86                "gpa": 3.0,
87                "age": 23
88            }),
89        )
90        .await?;
91    println!("āœ… Bob's record updated.");
92
93    // --- SCENARIO 4: SORTING (GET) ---
94    println!("šŸ“Š Action: Fetching Top Students (Sorted by GPA DESC)...");
95    let mut sort_params = HashMap::new();
96    sort_params.insert("_sort", "gpa");
97    sort_params.insert("_order", "desc");
98
99    let sorted = client.get("students", Some(sort_params)).await?;
100    if let Some(list) = sorted.as_array() {
101        for s in list {
102            println!("   - {} (GPA: {})", s["name"], s["gpa"]);
103        }
104    }
105
106    // --- SCENARIO 5: DELETE (DELETE) ---
107    println!("āŒ Action: Deleting Charlie...");
108    // Find Charlie first to get ID (Simulated) or assuming ID 3 since it's sequential
109    client.delete("students", 3).await?;
110    println!("āœ… Charlie deleted.");
111
112    println!("\n✨ --- DEMO COMPLETED SUCCESSFULLY ---");
113
114    // Optional: Keep server running if you want to test manually via browser
115    // std::future::pending::<()>().await;
116
117    Ok(())
118}