Skip to content

Commit fe79e95

Browse files
committed
More API improvements
1 parent 9cfe4cd commit fe79e95

File tree

4 files changed

+31
-43
lines changed

4 files changed

+31
-43
lines changed

examples/data_type.rs

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ extern crate redismodule;
33

44
use redismodule::{Context, Command, RedisResult, NextArg};
55
use redismodule::native_types::RedisType;
6+
use redismodule::redismodule::RedisValue;
67

78
#[derive(Debug)]
89
struct MyType {
@@ -20,53 +21,38 @@ fn alloc_set(ctx: &Context, args: Vec<String>) -> RedisResult {
2021

2122
let key = ctx.open_key_writable(&key);
2223

23-
if key.is_empty() {
24-
let value = MyType {
25-
data: "A".repeat(size as usize)
26-
};
27-
28-
ctx.log_debug(format!("key is empty; setting to value: '{:?}'", value).as_str());
29-
30-
key.set_value(&MY_REDIS_TYPE, value)?;
31-
} else {
32-
ctx.log_debug(format!("key exists; getting value").as_str());
33-
34-
let value: &mut MyType = key.get_value(&MY_REDIS_TYPE)?;
35-
ctx.log_debug(format!("got value: '{:?}'", value).as_str());
36-
37-
value.data = "B".repeat(size as usize);
38-
ctx.log_debug(format!("new value: '{:?}'", value).as_str());
39-
};
24+
match key.get_value::<MyType>(&MY_REDIS_TYPE)? {
25+
None => {
26+
let value = MyType {
27+
data: "A".repeat(size as usize)
28+
};
29+
30+
key.set_value(&MY_REDIS_TYPE, value)?;
31+
}
32+
Some(value) => {
33+
value.data = "B".repeat(size as usize);
34+
}
35+
}
4036

4137
Ok(size.into())
4238
}
4339

44-
45-
/*
4640
fn alloc_get(ctx: &Context, args: Vec<String>) -> RedisResult {
4741
let mut args = args.into_iter().skip(1);
4842
let key = args.next_string()?;
4943

50-
let key = ctx.open_key(&key);
51-
52-
key.verify_and_get_type(&MY_REDIS_TYPE)?;
53-
let my = key.get_value() as *mut MyType;
44+
let key = ctx.open_key_writable(&key); // TODO: Use read-only key
5445

55-
if my.is_null() {
56-
r.reply_integer(0)?;
57-
return Ok(());
46+
match key.get_value::<MyType>(&MY_REDIS_TYPE)? {
47+
None => Ok(RedisValue::None),
48+
Some(value) => {
49+
// TODO: Use the value
50+
let _ = value;
51+
Ok("some value".into())
52+
}
5853
}
5954

60-
let my = unsafe { &mut *my };
61-
let size = my.data.len();
62-
63-
r.reply_array(2)?;
64-
r.reply_integer(size as i64)?;
65-
r.reply_string(my.data.as_str())?;
66-
67-
Ok(())
6855
}
69-
*/
7056

7157
//////////////////////////////////////////////////////
7258

src/context.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ impl Context {
7070
raw::Status::Ok
7171
}
7272

73+
Ok(RedisValue::None) => unsafe {
74+
raw::RedisModule_ReplyWithNull.unwrap()(self.ctx).into()
75+
}
76+
7377
Err(RedisError::WrongArity) => unsafe {
7478
raw::RedisModule_WrongArity.unwrap()(self.ctx).into()
7579
}
@@ -83,10 +87,6 @@ impl Context {
8387
let msg = CString::new(s).unwrap();
8488
raw::RedisModule_ReplyWithError.unwrap()(self.ctx, msg.as_ptr()).into()
8589
}
86-
87-
Err(RedisError::MissingValue) => unsafe {
88-
raw::RedisModule_ReplyWithNull.unwrap()(self.ctx).into()
89-
}
9090
}
9191
}
9292

src/key.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,22 +173,24 @@ impl RedisKeyWritable {
173173
Ok("OK".into())
174174
}
175175

176-
pub fn get_value<T: Debug>(&self, redis_type: &RedisType) -> Result<&mut T, RedisError> {
176+
pub fn get_value<T: Debug>(&self, redis_type: &RedisType) -> Result<Option<&mut T>, RedisError> {
177177
self.verify_type(redis_type)?;
178178

179+
redis_log(self.ctx, "Going to get value");
180+
179181
let value = unsafe {
180182
raw::RedisModule_ModuleTypeGetValue.unwrap()(self.key_inner) as *mut T
181183
};
182184

183185
if value.is_null() {
184-
return Err(RedisError::MissingValue);
186+
return Ok(None)
185187
}
186188

187189
let value = unsafe { &mut *value };
188190

189191
redis_log(self.ctx, format!("got value: '{:?}'", value).as_str());
190192

191-
Ok(value)
193+
Ok(Some(value))
192194
}
193195

194196
pub fn set_value<T: Debug>(&self, redis_type: &RedisType, value: T) -> Result<(), RedisError> {

src/redismodule.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ pub enum RedisError {
1111
WrongArity,
1212
Str(&'static str),
1313
String(String),
14-
MissingValue,
1514
}
1615

1716
#[derive(Debug, PartialEq)]
1817
pub enum RedisValue {
1918
String(String),
2019
Integer(i64),
2120
Array(Vec<RedisValue>),
21+
None,
2222
}
2323

2424
impl From<i64> for RedisValue {

0 commit comments

Comments
 (0)