Skip to content

Commit 712f0e0

Browse files
authored
DEV: add Rust TCEs to existing 3QFY2026 hash commands (#2244)
* DEV: add Rust TCEs to existing 3QFY2026 hash commands * Apply suggestions from code review
1 parent 1656b38 commit 712f0e0

File tree

2 files changed

+706
-0
lines changed

2 files changed

+706
-0
lines changed
Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
// EXAMPLE: cmds_hash
2+
#[cfg(test)]
3+
mod cmds_hash_tests {
4+
use redis::AsyncCommands;
5+
use std::collections::HashMap;
6+
7+
#[tokio::test]
8+
async fn run() {
9+
let mut r = match redis::Client::open("redis://127.0.0.1") {
10+
Ok(client) => {
11+
match client.get_multiplexed_async_connection().await {
12+
Ok(conn) => conn,
13+
Err(e) => {
14+
println!("Failed to connect to Redis: {e}");
15+
return;
16+
}
17+
}
18+
},
19+
Err(e) => {
20+
println!("Failed to create Redis client: {e}");
21+
return;
22+
}
23+
};
24+
25+
// Clean up any existing data
26+
let _: Result<i32, _> = r.del("myhash").await;
27+
28+
// STEP_START hdel
29+
match r.hset("myhash", "field1", "foo").await {
30+
Ok(hdel1) => {
31+
let hdel1: i32 = hdel1;
32+
println!("{hdel1}"); // >>> 1
33+
// REMOVE_START
34+
assert_eq!(hdel1, 1);
35+
// REMOVE_END
36+
},
37+
Err(e) => {
38+
println!("Error setting hash field: {e}");
39+
return;
40+
}
41+
}
42+
43+
match r.hget("myhash", "field1").await {
44+
Ok(hdel2) => {
45+
let hdel2: Option<String> = hdel2;
46+
match hdel2 {
47+
Some(value) => {
48+
println!("{value}"); // >>> foo
49+
// REMOVE_START
50+
assert_eq!(value, "foo");
51+
// REMOVE_END
52+
},
53+
None => {
54+
println!("None");
55+
// REMOVE_START
56+
panic!("Expected value but got None");
57+
// REMOVE_END
58+
}
59+
}
60+
},
61+
Err(e) => {
62+
println!("Error getting hash field: {e}");
63+
return;
64+
}
65+
}
66+
67+
match r.hget("myhash", "field2").await {
68+
Ok(hdel3) => {
69+
let hdel3: Option<String> = hdel3;
70+
match hdel3 {
71+
Some(_) => {
72+
println!("Some value");
73+
// REMOVE_START
74+
panic!("Expected None but got Some");
75+
// REMOVE_END
76+
},
77+
None => {
78+
println!("None"); // >>> None
79+
// REMOVE_START
80+
assert!(hdel3.is_none());
81+
// REMOVE_END
82+
}
83+
}
84+
},
85+
Err(e) => {
86+
println!("Error getting hash field: {e}");
87+
return;
88+
}
89+
}
90+
91+
// REMOVE_START
92+
let _: Result<i32, _> = r.del("myhash").await;
93+
// REMOVE_END
94+
// STEP_END
95+
96+
// STEP_START hset
97+
match r.hset("myhash", "field1", "Hello").await {
98+
Ok(res1) => {
99+
let res1: i32 = res1;
100+
println!("{res1}"); // >>> 1
101+
// REMOVE_START
102+
assert_eq!(res1, 1);
103+
// REMOVE_END
104+
},
105+
Err(e) => {
106+
println!("Error setting hash field: {e}");
107+
return;
108+
}
109+
}
110+
111+
match r.hget("myhash", "field1").await {
112+
Ok(res2) => {
113+
let res2: Option<String> = res2;
114+
match res2 {
115+
Some(value) => {
116+
println!("{value}"); // >>> Hello
117+
// REMOVE_START
118+
assert_eq!(value, "Hello");
119+
// REMOVE_END
120+
},
121+
None => {
122+
println!("None");
123+
// REMOVE_START
124+
panic!("Expected value but got None");
125+
// REMOVE_END
126+
}
127+
}
128+
},
129+
Err(e) => {
130+
println!("Error getting hash field: {e}");
131+
return;
132+
}
133+
}
134+
135+
// Set multiple fields using hset_multiple
136+
let hash_fields = [
137+
("field2", "Hi"),
138+
("field3", "World"),
139+
];
140+
141+
if let Ok(res) = r.hset_multiple("myhash", &hash_fields).await {
142+
let res: String = res;
143+
println!("{res}"); // >>> OK
144+
// REMOVE_START
145+
assert_eq!(res, "OK");
146+
// REMOVE_END
147+
}
148+
149+
match r.hget("myhash", "field2").await {
150+
Ok(res4) => {
151+
let res4: Option<String> = res4;
152+
match res4 {
153+
Some(value) => {
154+
println!("{value}"); // >>> Hi
155+
// REMOVE_START
156+
assert_eq!(value, "Hi");
157+
// REMOVE_END
158+
},
159+
None => {
160+
println!("None");
161+
// REMOVE_START
162+
panic!("Expected value but got None");
163+
// REMOVE_END
164+
}
165+
}
166+
},
167+
Err(e) => {
168+
println!("Error getting hash field: {e}");
169+
return;
170+
}
171+
}
172+
173+
match r.hget("myhash", "field3").await {
174+
Ok(res5) => {
175+
let res5: Option<String> = res5;
176+
match res5 {
177+
Some(value) => {
178+
println!("{value}"); // >>> World
179+
// REMOVE_START
180+
assert_eq!(value, "World");
181+
// REMOVE_END
182+
},
183+
None => {
184+
println!("None");
185+
// REMOVE_START
186+
panic!("Expected value but got None");
187+
// REMOVE_END
188+
}
189+
}
190+
},
191+
Err(e) => {
192+
println!("Error getting hash field: {e}");
193+
return;
194+
}
195+
}
196+
197+
match r.hgetall("myhash").await {
198+
Ok(res6) => {
199+
let res6: HashMap<String, String> = res6;
200+
println!("{res6:?}"); // >>> {"field1": "Hello", "field2": "Hi", "field3": "World"}
201+
// REMOVE_START
202+
let mut expected = HashMap::new();
203+
expected.insert("field1".to_string(), "Hello".to_string());
204+
expected.insert("field2".to_string(), "Hi".to_string());
205+
expected.insert("field3".to_string(), "World".to_string());
206+
assert_eq!(res6, expected);
207+
// REMOVE_END
208+
},
209+
Err(e) => {
210+
println!("Error getting all hash fields: {e}");
211+
return;
212+
}
213+
}
214+
215+
// REMOVE_START
216+
let _: Result<i32, _> = r.del("myhash").await;
217+
// REMOVE_END
218+
// STEP_END
219+
220+
// STEP_START hget
221+
match r.hset("myhash", "field1", "foo").await {
222+
Ok(res7) => {
223+
let res7: i32 = res7;
224+
println!("{res7}"); // >>> 1
225+
// REMOVE_START
226+
assert_eq!(res7, 1);
227+
// REMOVE_END
228+
},
229+
Err(e) => {
230+
println!("Error setting hash field: {e}");
231+
return;
232+
}
233+
}
234+
235+
match r.hget("myhash", "field1").await {
236+
Ok(res8) => {
237+
let res8: Option<String> = res8;
238+
match res8 {
239+
Some(value) => {
240+
println!("{value}"); // >>> foo
241+
// REMOVE_START
242+
assert_eq!(value, "foo");
243+
// REMOVE_END
244+
},
245+
None => {
246+
println!("None");
247+
// REMOVE_START
248+
panic!("Expected value but got None");
249+
// REMOVE_END
250+
}
251+
}
252+
},
253+
Err(e) => {
254+
println!("Error getting hash field: {e}");
255+
return;
256+
}
257+
}
258+
259+
match r.hget("myhash", "field2").await {
260+
Ok(res9) => {
261+
let res9: Option<String> = res9;
262+
match res9 {
263+
Some(_) => {
264+
println!("Some value");
265+
// REMOVE_START
266+
panic!("Expected None but got Some");
267+
// REMOVE_END
268+
},
269+
None => {
270+
println!("None"); // >>> None
271+
// REMOVE_START
272+
assert!(res9.is_none());
273+
// REMOVE_END
274+
}
275+
}
276+
},
277+
Err(e) => {
278+
println!("Error getting hash field: {e}");
279+
return;
280+
}
281+
}
282+
283+
// REMOVE_START
284+
let _: Result<i32, _> = r.del("myhash").await;
285+
// REMOVE_END
286+
// STEP_END
287+
288+
// STEP_START hgetall
289+
let hash_fields = [
290+
("field1", "Hello"),
291+
("field2", "World"),
292+
];
293+
294+
if let Ok(_) = r.hset_multiple::<&str, &str, &str, String>("myhash", &hash_fields).await {
295+
// Fields set successfully
296+
}
297+
298+
match r.hgetall("myhash").await {
299+
Ok(res11) => {
300+
let res11: HashMap<String, String> = res11;
301+
println!("{res11:?}"); // >>> {"field1": "Hello", "field2": "World"}
302+
// REMOVE_START
303+
let mut expected = HashMap::new();
304+
expected.insert("field1".to_string(), "Hello".to_string());
305+
expected.insert("field2".to_string(), "World".to_string());
306+
assert_eq!(res11, expected);
307+
// REMOVE_END
308+
},
309+
Err(e) => {
310+
println!("Error getting all hash fields: {e}");
311+
return;
312+
}
313+
}
314+
315+
// REMOVE_START
316+
let _: Result<i32, _> = r.del("myhash").await;
317+
// REMOVE_END
318+
// STEP_END
319+
320+
// STEP_START hvals
321+
let hash_fields = [
322+
("field1", "Hello"),
323+
("field2", "World"),
324+
];
325+
326+
if let Ok(_) = r.hset_multiple::<&str, &str, &str, String>("myhash", &hash_fields).await {
327+
// Fields set successfully
328+
}
329+
330+
match r.hvals("myhash").await {
331+
Ok(res11) => {
332+
let res11: Vec<String> = res11;
333+
println!("{res11:?}"); // >>> ["Hello", "World"]
334+
// REMOVE_START
335+
let mut sorted_res = res11.clone();
336+
sorted_res.sort();
337+
let mut expected = vec!["Hello".to_string(), "World".to_string()];
338+
expected.sort();
339+
assert_eq!(sorted_res, expected);
340+
// REMOVE_END
341+
},
342+
Err(e) => {
343+
println!("Error getting hash values: {e}");
344+
return;
345+
}
346+
}
347+
348+
// REMOVE_START
349+
let _: Result<i32, _> = r.del("myhash").await;
350+
// REMOVE_END
351+
// STEP_END
352+
}
353+
}

0 commit comments

Comments
 (0)