use redis::Commands;
use redis_derive::{FromRedisValue, ToRedisArgs};
#[derive(FromRedisValue, ToRedisArgs, Debug, PartialEq)]
enum StatusNormal {
Active,
Inactive,
Pending,
}
#[derive(FromRedisValue, ToRedisArgs, Debug, PartialEq)]
#[redis(rename_all = "snake_case")]
enum StatusSnakeCase {
VeryActive,
SomewhatInactive,
StillPending,
}
fn main() -> redis::RedisResult<()> {
println!("🔍 Debug: Testing Attribute Parsing");
println!("===================================");
let client = redis::Client::open("redis://127.0.0.1:6379/")?;
let mut con = client.get_connection()?;
println!("\n1️⃣ Testing enum WITHOUT rename_all:");
let status1 = StatusNormal::Active;
let _: () = con.set("status_normal", &status1)?;
let stored1: String = con.get("status_normal")?;
println!(" ✓ StatusNormal::Active stored as: '{}'", stored1);
let status2 = StatusNormal::Inactive;
let args = redis::ToRedisArgs::to_redis_args(&status2);
let arg_str = String::from_utf8(args[0].clone()).unwrap();
println!(" ✓ StatusNormal::Inactive ToRedisArgs: '{}'", arg_str);
println!("\n2️⃣ Testing enum WITH rename_all = \"snake_case\":");
let status3 = StatusSnakeCase::VeryActive;
let _: () = con.set("status_snake", &status3)?;
let stored3: String = con.get("status_snake")?;
println!(" ✓ StatusSnakeCase::VeryActive stored as: '{}'", stored3);
println!(" 🔍 Expected: 'very_active' (if rename_all works)");
let status4 = StatusSnakeCase::SomewhatInactive;
let args = redis::ToRedisArgs::to_redis_args(&status4);
let arg_str = String::from_utf8(args[0].clone()).unwrap();
println!(" ✓ StatusSnakeCase::SomewhatInactive ToRedisArgs: '{}'", arg_str);
println!(" 🔍 Expected: 'somewhat_inactive' (if rename_all works)");
println!("\n3️⃣ Testing deserialization:");
let retrieved1: StatusNormal = con.get("status_normal")?;
println!(" ✓ Retrieved StatusNormal: {:?}", retrieved1);
assert_eq!(retrieved1, StatusNormal::Active);
let retrieved3: StatusSnakeCase = con.get("status_snake")?;
println!(" ✓ Retrieved StatusSnakeCase: {:?}", retrieved3);
assert_eq!(retrieved3, StatusSnakeCase::VeryActive);
println!("\n4️⃣ Testing manual Value deserialization:");
let test_value = redis::Value::SimpleString("very_active".to_string());
let result: redis::RedisResult<StatusSnakeCase> = redis::FromRedisValue::from_redis_value(&test_value);
match result {
Ok(val) => {
println!(" ✓ 'very_active' successfully deserialized to: {:?}", val);
println!(" ✅ rename_all is working for deserialization!");
}
Err(e) => {
println!(" ❌ 'very_active' failed to deserialize: {}", e);
println!(" 🔍 rename_all might not be working...");
let test_value2 = redis::Value::SimpleString("VeryActive".to_string());
let result2: redis::RedisResult<StatusSnakeCase> = redis::FromRedisValue::from_redis_value(&test_value2);
match result2 {
Ok(val) => {
println!(" ✓ 'VeryActive' (original case) deserialized to: {:?}", val);
println!(" ⚠️ rename_all is NOT working - using original enum names");
}
Err(e2) => {
println!(" ❌ Both 'very_active' and 'VeryActive' failed!");
println!(" Error 1: {}", e);
println!(" Error 2: {}", e2);
}
}
}
}
println!("\n🔍 Debug complete!");
Ok(())
}