From 82f7c7c20970c0c43913509f7ac5da7bfdf82cb4 Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Wed, 20 Feb 2019 17:34:05 +0200 Subject: [PATCH 1/2] Add support for str_len --- src/lib.rs | 16 ++++++++++++++++ src/redisjson.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index a399f89..fda4571 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,6 +47,21 @@ fn json_get(ctx: &Context, args: Vec) -> RedisResult { Ok(value) } +fn json_type(ctx: &Context, args: Vec) -> RedisResult { + let mut args = args.into_iter().skip(1); + let key = args.next_string()?; + let path = args.next_string()?; + + let key = ctx.open_key_writable(&key); + + let value = match key.get_value::(&REDIS_JSON_TYPE)? { + Some(doc) => { doc.get_type(&path)?.into() } + None => ().into() + }; + + Ok(value) +} + ////////////////////////////////////////////////////// redis_module! { @@ -58,5 +73,6 @@ redis_module! { commands: [ ["json.set", json_set, "write"], ["json.get", json_get, ""], + ["json.type", json_type, ""], ], } diff --git a/src/redisjson.rs b/src/redisjson.rs index 52b1e48..6d306d3 100644 --- a/src/redisjson.rs +++ b/src/redisjson.rs @@ -64,4 +64,30 @@ impl RedisJSON { return Ok(s) } + + pub fn get_type(&self, path: &str) -> Result { + let s = match self.get_doc(path)? { + Some(doc) => { + match *doc { + Value::Null => "Null", + Value::Bool(_) => "boolean", + Value::Number(_) => "number", + Value::String(_) => "string", + Value::Array(_) => "array", + Value::Object(_) => "object", + } + } + None => "" + }; + Ok(s.to_string()) + } + + pub fn get_doc(&self, path: &str) -> Result, Error> { + // Create a JSONPath selector + let selector = Selector::new(path).map_err(|e| Error { + msg: format!("{}", e), + })?; + + Ok(selector.find(&self.data).next()) + } } \ No newline at end of file From 0a72e7dea64a4b580fce215ecfa7b4c30a7ed5fd Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Mon, 4 Mar 2019 22:54:42 +0200 Subject: [PATCH 2/2] fix code review --- src/redisjson.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/redisjson.rs b/src/redisjson.rs index 6d306d3..fc3cf2f 100644 --- a/src/redisjson.rs +++ b/src/redisjson.rs @@ -68,8 +68,8 @@ impl RedisJSON { pub fn get_type(&self, path: &str) -> Result { let s = match self.get_doc(path)? { Some(doc) => { - match *doc { - Value::Null => "Null", + match doc { + Value::Null => "null", Value::Bool(_) => "boolean", Value::Number(_) => "number", Value::String(_) => "string",