EasyClient

Struct EasyClient 

Source
pub struct EasyClient {
    pub base_url: String,
}
Expand description

Client Structure: Allows users to easily connect to the server

Fieldsยง

ยงbase_url: String

Implementationsยง

Sourceยง

impl EasyClient

Source

pub fn new(host: &str, port: u16) -> Self

Creates a new client (e.g., localhost, 9000)

Examples found in repository?
examples/full_system.rs (line 44)
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}
More examples
Hide additional examples
examples/school_client.rs (line 8)
6async fn main() -> anyhow::Result<()> {
7    // Connect to the server (Localhost:9000)
8    let client = EasyClient::new("localhost", 9000);
9    println!("๐Ÿ”— Connected to the School System.\n");
10
11    // ==========================================
12    // SCENARIO 1: NEW RECORDS (POST)
13    // ==========================================
14    println!("๐Ÿ“ --- STEP 1: Registering Students and Grades ---");
15
16    // Class 10-A
17    client
18        .post(
19            "students",
20            json!({
21                "name": "Ali Yilmaz", "school_number": 101, "class_grade": "10-A", "gpa": 85.5
22            }),
23        )
24        .await?;
25
26    client
27        .post(
28            "students",
29            json!({
30                "name": "Zeynep Kaya", "school_number": 102, "class_grade": "10-A", "gpa": 92.0
31            }),
32        )
33        .await?;
34
35    // Class 11-B (Mehmet Demir)
36    client
37        .post(
38            "students",
39            json!({
40                "name": "Mehmet Demir", "school_number": 201, "class_grade": "11-B", "gpa": 76.5
41            }),
42        )
43        .await?;
44
45    // Grade Entry
46    client
47        .post(
48            "grades",
49            json!({"school_number": 101, "lesson": "Mathematics", "score": 90}),
50        )
51        .await?;
52    client
53        .post(
54            "grades",
55            json!({"school_number": 102, "lesson": "Mathematics", "score": 100}),
56        )
57        .await?;
58
59    println!("โœ… Registration complete.\n");
60
61    // ==========================================
62    // SCENARIO 2: DATA UPDATE (PUT)
63    // ==========================================
64    println!("๐Ÿ”„ --- STEP 2: Mehmet Demir Promoted (Update) ---");
65
66    // 1. First, let's find Mehmet (ID is required)
67    let mut search_params = HashMap::new();
68    search_params.insert("school_number", "201");
69
70    let search_res = client.get("students", Some(search_params)).await?;
71
72    if let Some(list) = search_res.as_array() {
73        if !list.is_empty() {
74            let mehmet_id = list[0]["id"].as_i64().unwrap();
75
76            // 2. Update Mehmet's class and GPA
77            client
78                .put(
79                    "students",
80                    mehmet_id,
81                    json!({
82                        "class_grade": "12-A", // Promoted to next grade
83                        "gpa": 80.0            // GPA increased
84                    }),
85                )
86                .await?;
87
88            println!("โœ… Mehmet (ID: {}) information updated.", mehmet_id);
89        }
90    }
91
92    // ==========================================
93    // SCENARIO 3: ADVANCED QUERY (GET + FILTER + SORT)
94    // ==========================================
95    println!("\n๐Ÿ” --- STEP 3: Class 10-A Report Card (Sorted) ---");
96
97    let mut params = HashMap::new();
98    params.insert("class_grade", "10-A"); // Filter: Only 10-A
99    params.insert("_sort", "gpa"); // Sort: By GPA
100    params.insert("_order", "desc"); // Direction: Descending (Highest first)
101
102    let results = client.get("students", Some(params)).await?;
103
104    if let Some(list) = results.as_array() {
105        for student in list {
106            println!(
107                " - {} (No: {}) -> GPA: {}",
108                student["name"], student["school_number"], student["gpa"]
109            );
110        }
111    } else {
112        println!("No data found.");
113    }
114
115    // ==========================================
116    // SCENARIO 4: DATA DELETION (DELETE)
117    // ==========================================
118    println!("\nโŒ --- STEP 4: Cleanup Graduates/Leavers (Delete) ---");
119
120    // Suppose Ali (ID: 1) has left the school.
121    let delete_res = client.delete("students", 1).await?;
122    println!("Deletion Result: {}", delete_res);
123
124    Ok(())
125}
Source

pub async fn get( &self, table: &str, params: Option<HashMap<&str, &str>>, ) -> Result<Value>

Sends a GET request (Supports Filtering and Sorting)

Examples found in repository?
examples/full_system.rs (line 74)
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}
More examples
Hide additional examples
examples/school_client.rs (line 70)
6async fn main() -> anyhow::Result<()> {
7    // Connect to the server (Localhost:9000)
8    let client = EasyClient::new("localhost", 9000);
9    println!("๐Ÿ”— Connected to the School System.\n");
10
11    // ==========================================
12    // SCENARIO 1: NEW RECORDS (POST)
13    // ==========================================
14    println!("๐Ÿ“ --- STEP 1: Registering Students and Grades ---");
15
16    // Class 10-A
17    client
18        .post(
19            "students",
20            json!({
21                "name": "Ali Yilmaz", "school_number": 101, "class_grade": "10-A", "gpa": 85.5
22            }),
23        )
24        .await?;
25
26    client
27        .post(
28            "students",
29            json!({
30                "name": "Zeynep Kaya", "school_number": 102, "class_grade": "10-A", "gpa": 92.0
31            }),
32        )
33        .await?;
34
35    // Class 11-B (Mehmet Demir)
36    client
37        .post(
38            "students",
39            json!({
40                "name": "Mehmet Demir", "school_number": 201, "class_grade": "11-B", "gpa": 76.5
41            }),
42        )
43        .await?;
44
45    // Grade Entry
46    client
47        .post(
48            "grades",
49            json!({"school_number": 101, "lesson": "Mathematics", "score": 90}),
50        )
51        .await?;
52    client
53        .post(
54            "grades",
55            json!({"school_number": 102, "lesson": "Mathematics", "score": 100}),
56        )
57        .await?;
58
59    println!("โœ… Registration complete.\n");
60
61    // ==========================================
62    // SCENARIO 2: DATA UPDATE (PUT)
63    // ==========================================
64    println!("๐Ÿ”„ --- STEP 2: Mehmet Demir Promoted (Update) ---");
65
66    // 1. First, let's find Mehmet (ID is required)
67    let mut search_params = HashMap::new();
68    search_params.insert("school_number", "201");
69
70    let search_res = client.get("students", Some(search_params)).await?;
71
72    if let Some(list) = search_res.as_array() {
73        if !list.is_empty() {
74            let mehmet_id = list[0]["id"].as_i64().unwrap();
75
76            // 2. Update Mehmet's class and GPA
77            client
78                .put(
79                    "students",
80                    mehmet_id,
81                    json!({
82                        "class_grade": "12-A", // Promoted to next grade
83                        "gpa": 80.0            // GPA increased
84                    }),
85                )
86                .await?;
87
88            println!("โœ… Mehmet (ID: {}) information updated.", mehmet_id);
89        }
90    }
91
92    // ==========================================
93    // SCENARIO 3: ADVANCED QUERY (GET + FILTER + SORT)
94    // ==========================================
95    println!("\n๐Ÿ” --- STEP 3: Class 10-A Report Card (Sorted) ---");
96
97    let mut params = HashMap::new();
98    params.insert("class_grade", "10-A"); // Filter: Only 10-A
99    params.insert("_sort", "gpa"); // Sort: By GPA
100    params.insert("_order", "desc"); // Direction: Descending (Highest first)
101
102    let results = client.get("students", Some(params)).await?;
103
104    if let Some(list) = results.as_array() {
105        for student in list {
106            println!(
107                " - {} (No: {}) -> GPA: {}",
108                student["name"], student["school_number"], student["gpa"]
109            );
110        }
111    } else {
112        println!("No data found.");
113    }
114
115    // ==========================================
116    // SCENARIO 4: DATA DELETION (DELETE)
117    // ==========================================
118    println!("\nโŒ --- STEP 4: Cleanup Graduates/Leavers (Delete) ---");
119
120    // Suppose Ali (ID: 1) has left the school.
121    let delete_res = client.delete("students", 1).await?;
122    println!("Deletion Result: {}", delete_res);
123
124    Ok(())
125}
Source

pub async fn post(&self, table: &str, data: Value) -> Result<Value>

Sends a POST request (Create Data)

Examples found in repository?
examples/full_system.rs (lines 50-53)
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}
More examples
Hide additional examples
examples/school_client.rs (lines 18-23)
6async fn main() -> anyhow::Result<()> {
7    // Connect to the server (Localhost:9000)
8    let client = EasyClient::new("localhost", 9000);
9    println!("๐Ÿ”— Connected to the School System.\n");
10
11    // ==========================================
12    // SCENARIO 1: NEW RECORDS (POST)
13    // ==========================================
14    println!("๐Ÿ“ --- STEP 1: Registering Students and Grades ---");
15
16    // Class 10-A
17    client
18        .post(
19            "students",
20            json!({
21                "name": "Ali Yilmaz", "school_number": 101, "class_grade": "10-A", "gpa": 85.5
22            }),
23        )
24        .await?;
25
26    client
27        .post(
28            "students",
29            json!({
30                "name": "Zeynep Kaya", "school_number": 102, "class_grade": "10-A", "gpa": 92.0
31            }),
32        )
33        .await?;
34
35    // Class 11-B (Mehmet Demir)
36    client
37        .post(
38            "students",
39            json!({
40                "name": "Mehmet Demir", "school_number": 201, "class_grade": "11-B", "gpa": 76.5
41            }),
42        )
43        .await?;
44
45    // Grade Entry
46    client
47        .post(
48            "grades",
49            json!({"school_number": 101, "lesson": "Mathematics", "score": 90}),
50        )
51        .await?;
52    client
53        .post(
54            "grades",
55            json!({"school_number": 102, "lesson": "Mathematics", "score": 100}),
56        )
57        .await?;
58
59    println!("โœ… Registration complete.\n");
60
61    // ==========================================
62    // SCENARIO 2: DATA UPDATE (PUT)
63    // ==========================================
64    println!("๐Ÿ”„ --- STEP 2: Mehmet Demir Promoted (Update) ---");
65
66    // 1. First, let's find Mehmet (ID is required)
67    let mut search_params = HashMap::new();
68    search_params.insert("school_number", "201");
69
70    let search_res = client.get("students", Some(search_params)).await?;
71
72    if let Some(list) = search_res.as_array() {
73        if !list.is_empty() {
74            let mehmet_id = list[0]["id"].as_i64().unwrap();
75
76            // 2. Update Mehmet's class and GPA
77            client
78                .put(
79                    "students",
80                    mehmet_id,
81                    json!({
82                        "class_grade": "12-A", // Promoted to next grade
83                        "gpa": 80.0            // GPA increased
84                    }),
85                )
86                .await?;
87
88            println!("โœ… Mehmet (ID: {}) information updated.", mehmet_id);
89        }
90    }
91
92    // ==========================================
93    // SCENARIO 3: ADVANCED QUERY (GET + FILTER + SORT)
94    // ==========================================
95    println!("\n๐Ÿ” --- STEP 3: Class 10-A Report Card (Sorted) ---");
96
97    let mut params = HashMap::new();
98    params.insert("class_grade", "10-A"); // Filter: Only 10-A
99    params.insert("_sort", "gpa"); // Sort: By GPA
100    params.insert("_order", "desc"); // Direction: Descending (Highest first)
101
102    let results = client.get("students", Some(params)).await?;
103
104    if let Some(list) = results.as_array() {
105        for student in list {
106            println!(
107                " - {} (No: {}) -> GPA: {}",
108                student["name"], student["school_number"], student["gpa"]
109            );
110        }
111    } else {
112        println!("No data found.");
113    }
114
115    // ==========================================
116    // SCENARIO 4: DATA DELETION (DELETE)
117    // ==========================================
118    println!("\nโŒ --- STEP 4: Cleanup Graduates/Leavers (Delete) ---");
119
120    // Suppose Ali (ID: 1) has left the school.
121    let delete_res = client.delete("students", 1).await?;
122    println!("Deletion Result: {}", delete_res);
123
124    Ok(())
125}
Source

pub async fn put(&self, table: &str, id: i64, data: Value) -> Result<Value>

Sends a PUT request (Update Data)

Examples found in repository?
examples/full_system.rs (lines 82-89)
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}
More examples
Hide additional examples
examples/school_client.rs (lines 78-85)
6async fn main() -> anyhow::Result<()> {
7    // Connect to the server (Localhost:9000)
8    let client = EasyClient::new("localhost", 9000);
9    println!("๐Ÿ”— Connected to the School System.\n");
10
11    // ==========================================
12    // SCENARIO 1: NEW RECORDS (POST)
13    // ==========================================
14    println!("๐Ÿ“ --- STEP 1: Registering Students and Grades ---");
15
16    // Class 10-A
17    client
18        .post(
19            "students",
20            json!({
21                "name": "Ali Yilmaz", "school_number": 101, "class_grade": "10-A", "gpa": 85.5
22            }),
23        )
24        .await?;
25
26    client
27        .post(
28            "students",
29            json!({
30                "name": "Zeynep Kaya", "school_number": 102, "class_grade": "10-A", "gpa": 92.0
31            }),
32        )
33        .await?;
34
35    // Class 11-B (Mehmet Demir)
36    client
37        .post(
38            "students",
39            json!({
40                "name": "Mehmet Demir", "school_number": 201, "class_grade": "11-B", "gpa": 76.5
41            }),
42        )
43        .await?;
44
45    // Grade Entry
46    client
47        .post(
48            "grades",
49            json!({"school_number": 101, "lesson": "Mathematics", "score": 90}),
50        )
51        .await?;
52    client
53        .post(
54            "grades",
55            json!({"school_number": 102, "lesson": "Mathematics", "score": 100}),
56        )
57        .await?;
58
59    println!("โœ… Registration complete.\n");
60
61    // ==========================================
62    // SCENARIO 2: DATA UPDATE (PUT)
63    // ==========================================
64    println!("๐Ÿ”„ --- STEP 2: Mehmet Demir Promoted (Update) ---");
65
66    // 1. First, let's find Mehmet (ID is required)
67    let mut search_params = HashMap::new();
68    search_params.insert("school_number", "201");
69
70    let search_res = client.get("students", Some(search_params)).await?;
71
72    if let Some(list) = search_res.as_array() {
73        if !list.is_empty() {
74            let mehmet_id = list[0]["id"].as_i64().unwrap();
75
76            // 2. Update Mehmet's class and GPA
77            client
78                .put(
79                    "students",
80                    mehmet_id,
81                    json!({
82                        "class_grade": "12-A", // Promoted to next grade
83                        "gpa": 80.0            // GPA increased
84                    }),
85                )
86                .await?;
87
88            println!("โœ… Mehmet (ID: {}) information updated.", mehmet_id);
89        }
90    }
91
92    // ==========================================
93    // SCENARIO 3: ADVANCED QUERY (GET + FILTER + SORT)
94    // ==========================================
95    println!("\n๐Ÿ” --- STEP 3: Class 10-A Report Card (Sorted) ---");
96
97    let mut params = HashMap::new();
98    params.insert("class_grade", "10-A"); // Filter: Only 10-A
99    params.insert("_sort", "gpa"); // Sort: By GPA
100    params.insert("_order", "desc"); // Direction: Descending (Highest first)
101
102    let results = client.get("students", Some(params)).await?;
103
104    if let Some(list) = results.as_array() {
105        for student in list {
106            println!(
107                " - {} (No: {}) -> GPA: {}",
108                student["name"], student["school_number"], student["gpa"]
109            );
110        }
111    } else {
112        println!("No data found.");
113    }
114
115    // ==========================================
116    // SCENARIO 4: DATA DELETION (DELETE)
117    // ==========================================
118    println!("\nโŒ --- STEP 4: Cleanup Graduates/Leavers (Delete) ---");
119
120    // Suppose Ali (ID: 1) has left the school.
121    let delete_res = client.delete("students", 1).await?;
122    println!("Deletion Result: {}", delete_res);
123
124    Ok(())
125}
Source

pub async fn delete(&self, table: &str, id: i64) -> Result<Value>

Sends a DELETE request (Delete Data)

Examples found in repository?
examples/full_system.rs (line 109)
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}
More examples
Hide additional examples
examples/school_client.rs (line 121)
6async fn main() -> anyhow::Result<()> {
7    // Connect to the server (Localhost:9000)
8    let client = EasyClient::new("localhost", 9000);
9    println!("๐Ÿ”— Connected to the School System.\n");
10
11    // ==========================================
12    // SCENARIO 1: NEW RECORDS (POST)
13    // ==========================================
14    println!("๐Ÿ“ --- STEP 1: Registering Students and Grades ---");
15
16    // Class 10-A
17    client
18        .post(
19            "students",
20            json!({
21                "name": "Ali Yilmaz", "school_number": 101, "class_grade": "10-A", "gpa": 85.5
22            }),
23        )
24        .await?;
25
26    client
27        .post(
28            "students",
29            json!({
30                "name": "Zeynep Kaya", "school_number": 102, "class_grade": "10-A", "gpa": 92.0
31            }),
32        )
33        .await?;
34
35    // Class 11-B (Mehmet Demir)
36    client
37        .post(
38            "students",
39            json!({
40                "name": "Mehmet Demir", "school_number": 201, "class_grade": "11-B", "gpa": 76.5
41            }),
42        )
43        .await?;
44
45    // Grade Entry
46    client
47        .post(
48            "grades",
49            json!({"school_number": 101, "lesson": "Mathematics", "score": 90}),
50        )
51        .await?;
52    client
53        .post(
54            "grades",
55            json!({"school_number": 102, "lesson": "Mathematics", "score": 100}),
56        )
57        .await?;
58
59    println!("โœ… Registration complete.\n");
60
61    // ==========================================
62    // SCENARIO 2: DATA UPDATE (PUT)
63    // ==========================================
64    println!("๐Ÿ”„ --- STEP 2: Mehmet Demir Promoted (Update) ---");
65
66    // 1. First, let's find Mehmet (ID is required)
67    let mut search_params = HashMap::new();
68    search_params.insert("school_number", "201");
69
70    let search_res = client.get("students", Some(search_params)).await?;
71
72    if let Some(list) = search_res.as_array() {
73        if !list.is_empty() {
74            let mehmet_id = list[0]["id"].as_i64().unwrap();
75
76            // 2. Update Mehmet's class and GPA
77            client
78                .put(
79                    "students",
80                    mehmet_id,
81                    json!({
82                        "class_grade": "12-A", // Promoted to next grade
83                        "gpa": 80.0            // GPA increased
84                    }),
85                )
86                .await?;
87
88            println!("โœ… Mehmet (ID: {}) information updated.", mehmet_id);
89        }
90    }
91
92    // ==========================================
93    // SCENARIO 3: ADVANCED QUERY (GET + FILTER + SORT)
94    // ==========================================
95    println!("\n๐Ÿ” --- STEP 3: Class 10-A Report Card (Sorted) ---");
96
97    let mut params = HashMap::new();
98    params.insert("class_grade", "10-A"); // Filter: Only 10-A
99    params.insert("_sort", "gpa"); // Sort: By GPA
100    params.insert("_order", "desc"); // Direction: Descending (Highest first)
101
102    let results = client.get("students", Some(params)).await?;
103
104    if let Some(list) = results.as_array() {
105        for student in list {
106            println!(
107                " - {} (No: {}) -> GPA: {}",
108                student["name"], student["school_number"], student["gpa"]
109            );
110        }
111    } else {
112        println!("No data found.");
113    }
114
115    // ==========================================
116    // SCENARIO 4: DATA DELETION (DELETE)
117    // ==========================================
118    println!("\nโŒ --- STEP 4: Cleanup Graduates/Leavers (Delete) ---");
119
120    // Suppose Ali (ID: 1) has left the school.
121    let delete_res = client.delete("students", 1).await?;
122    println!("Deletion Result: {}", delete_res);
123
124    Ok(())
125}

Auto Trait Implementationsยง

Blanket Implementationsยง

Sourceยง

impl<T> Any for T
where T: 'static + ?Sized,

Sourceยง

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Sourceยง

impl<T> Borrow<T> for T
where T: ?Sized,

Sourceยง

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Sourceยง

impl<T> BorrowMut<T> for T
where T: ?Sized,

Sourceยง

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Sourceยง

impl<T> From<T> for T

Sourceยง

fn from(t: T) -> T

Returns the argument unchanged.

Sourceยง

impl<T> Instrument for T

Sourceยง

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Sourceยง

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Sourceยง

impl<T, U> Into<U> for T
where U: From<T>,

Sourceยง

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Sourceยง

impl<T> PolicyExt for T
where T: ?Sized,

Sourceยง

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Sourceยง

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Sourceยง

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Sourceยง

type Error = Infallible

The type returned in the event of a conversion error.
Sourceยง

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Sourceยง

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Sourceยง

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Sourceยง

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Sourceยง

impl<T> WithSubscriber for T

Sourceยง

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Sourceยง

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more