pub struct EasyClient {
pub base_url: String,
}Expand description
Client Structure: Allows users to easily connect to the server
Fieldsยง
ยงbase_url: StringImplementationsยง
Sourceยงimpl EasyClient
impl EasyClient
Sourcepub fn new(host: &str, port: u16) -> Self
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
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}Sourcepub async fn get(
&self,
table: &str,
params: Option<HashMap<&str, &str>>,
) -> Result<Value>
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
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}Sourcepub async fn post(&self, table: &str, data: Value) -> Result<Value>
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
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}Sourcepub async fn put(&self, table: &str, id: i64, data: Value) -> Result<Value>
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
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}Sourcepub async fn delete(&self, table: &str, id: i64) -> Result<Value>
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
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ยง
impl Freeze for EasyClient
impl RefUnwindSafe for EasyClient
impl Send for EasyClient
impl Sync for EasyClient
impl Unpin for EasyClient
impl UnwindSafe for EasyClient
Blanket Implementationsยง
Sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more