#[macro_use]
extern crate redis_module;
use redis_module::{alloc::RedisAlloc, Context, RedisError, RedisResult, RedisString, RedisValue};
pub fn cas(ctx: &Context, args: Vec<RedisString>) -> RedisResult {
match args.as_slice() {
[_, key, current, new_value] => {
if let RedisValue::SimpleString(value) = ctx.call("GET", &[key.try_as_str()?])? {
if value.eq(¤t.try_as_str()?) {
let _ = ctx.call("SET", &[key.try_as_str()?, new_value.try_as_str()?])?;
return Ok(RedisValue::Integer(1));
}
}
Ok(RedisValue::Integer(0))
}
[_, key, current] => {
if let RedisValue::SimpleString(value) = ctx.call("GET", &[key.try_as_str()?])? {
if value.eq(¤t.try_as_str()?) {
let _ = ctx.call("DEL", &[key.try_as_str()?])?;
return Ok(RedisValue::Integer(1));
}
}
Ok(RedisValue::Integer(0))
}
_ => Err(RedisError::WrongArity),
}
}
redis_module! {
name: "redis_cas",
version: 1,
allocator: (RedisAlloc, RedisAlloc),
data_types: [],
commands: [
["cas", cas, "write fast", 1, 1, 0],
],
}