From c115b008d126dc9e9c1662bbc589737e22a673be Mon Sep 17 00:00:00 2001 From: Rahul Ghangas Date: Sat, 29 May 2021 15:59:52 +0530 Subject: [PATCH 1/5] chore: remove unimplemented errors --- redisless/src/server/util/run_command.rs | 38 +++++++++++++----------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/redisless/src/server/util/run_command.rs b/redisless/src/server/util/run_command.rs index 93520c2..4ff0619 100644 --- a/redisless/src/server/util/run_command.rs +++ b/redisless/src/server/util/run_command.rs @@ -123,15 +123,16 @@ pub fn run_command_and_get_response( match storage.read(k.as_slice()) { Some(value) => { - if let Ok(mut int_val) = std::str::from_utf8(value).unwrap().parse::() - { - int_val += 1; - let new_value = int_val.to_string().into_bytes(); - storage.write(k.as_slice(), new_value.as_slice()); - RedisResponse::single(Integer(int_val as i64)) - } else { - // handle this error - unimplemented!() + match std::str::from_utf8(value).unwrap().parse::() { + Ok(int_val) => { + int_val += 1; + let new_value = int_val.to_string().into_bytes(); + storage.write(k.as_slice(), new_value.as_slice()); + RedisResponse::single(Integer(int_val as i64)) + } + Err(error) => { + RedisResponse::error(RedisCommandError::IntParse(err)) + } } } None => { @@ -146,15 +147,16 @@ pub fn run_command_and_get_response( match storage.read(k.as_slice()) { Some(value) => { - if let Ok(mut int_val) = std::str::from_utf8(value).unwrap().parse::() - { - int_val += increment; - let new_value = int_val.to_string().into_bytes(); - storage.write(k.as_slice(), new_value.as_slice()); - RedisResponse::single(Integer(int_val as i64)) - } else { - //RedisResponse::error(...) - unimplemented!() + match std::str::from_utf8(value).unwrap().parse::() { + Ok(int_val) => { + int_val += increment; + let new_value = int_val.to_string().into_bytes(); + storage.write(k.as_slice(), new_value.as_slice()); + RedisResponse::single(Integer(int_val as i64)) + } + Err(error) => { + RedisResponse::error(RedisCommandError::IntParse(err)) + } } } None => { From 186983c12c0fe360660aa2beb37b4adf6e12bda6 Mon Sep 17 00:00:00 2001 From: Rahul Ghangas Date: Sat, 29 May 2021 19:43:15 +0530 Subject: [PATCH 2/5] test: add test for error --- redisless/src/server/tests/mod.rs | 13 +++++++++++++ redisless/src/server/util/run_command.rs | 12 ++++-------- redisless/src/storage/models/mod.rs | 4 ++-- redisless/src/storage/models/{meta.rs => zeta.rs} | 0 4 files changed, 19 insertions(+), 10 deletions(-) rename redisless/src/storage/models/{meta.rs => zeta.rs} (100%) diff --git a/redisless/src/server/tests/mod.rs b/redisless/src/server/tests/mod.rs index d0f9cb4..07c3f43 100644 --- a/redisless/src/server/tests/mod.rs +++ b/redisless/src/server/tests/mod.rs @@ -1,6 +1,7 @@ use redis::{Commands, Connection, RedisResult}; use std::{thread::sleep, time::Duration}; +use crate::command::command_error::RedisCommandError; use crate::server::ServerState; use crate::storage::in_memory::InMemoryStorage; use crate::Server; @@ -37,6 +38,18 @@ fn test_incr_decr_commands() { let value: u32 = con.get("63").unwrap(); assert_eq!(value, 79_u32); + let response: Result = con.incr("63", "foo"); + match response { + Ok(_) => panic!("got valid response from incr command for key {} and value {}", "63", "foo"), + Err(error) => { + assert_eq!(error.kind(), redis::ErrorKind::ExtensionError); + match error.detail() { + None => panic!("returned error was None"), + Some(error_string) => assert_eq!(error_string, "invalid digit found in string"), + } + } + }; + assert_eq!(server.stop(), Some(ServerState::Stopped)); } diff --git a/redisless/src/server/util/run_command.rs b/redisless/src/server/util/run_command.rs index 4ff0619..81f245b 100644 --- a/redisless/src/server/util/run_command.rs +++ b/redisless/src/server/util/run_command.rs @@ -124,15 +124,13 @@ pub fn run_command_and_get_response( match storage.read(k.as_slice()) { Some(value) => { match std::str::from_utf8(value).unwrap().parse::() { - Ok(int_val) => { + Ok(mut int_val) => { int_val += 1; let new_value = int_val.to_string().into_bytes(); storage.write(k.as_slice(), new_value.as_slice()); RedisResponse::single(Integer(int_val as i64)) } - Err(error) => { - RedisResponse::error(RedisCommandError::IntParse(err)) - } + Err(error) => RedisResponse::error(RedisCommandError::IntParse(error)) } } None => { @@ -148,15 +146,13 @@ pub fn run_command_and_get_response( match storage.read(k.as_slice()) { Some(value) => { match std::str::from_utf8(value).unwrap().parse::() { - Ok(int_val) => { + Ok(mut int_val) => { int_val += increment; let new_value = int_val.to_string().into_bytes(); storage.write(k.as_slice(), new_value.as_slice()); RedisResponse::single(Integer(int_val as i64)) } - Err(error) => { - RedisResponse::error(RedisCommandError::IntParse(err)) - } + Err(error) => RedisResponse::error(RedisCommandError::IntParse(error)) } } None => { diff --git a/redisless/src/storage/models/mod.rs b/redisless/src/storage/models/mod.rs index 4a58ea0..330067b 100644 --- a/redisless/src/storage/models/mod.rs +++ b/redisless/src/storage/models/mod.rs @@ -1,12 +1,12 @@ pub mod expiry; pub mod hash; -pub mod meta; +pub mod zeta; // re-export so one can use with models::Expiry // rather than models::expiry::Expiry pub use expiry::Expiry; pub use hash::RedisHashMap; -pub use meta::RedisMeta; +pub use zeta::RedisMeta; pub type RedisString = Vec; diff --git a/redisless/src/storage/models/meta.rs b/redisless/src/storage/models/zeta.rs similarity index 100% rename from redisless/src/storage/models/meta.rs rename to redisless/src/storage/models/zeta.rs From c72d7c4a6f6dd30f8a79a494b914c0f84a2f5db4 Mon Sep 17 00:00:00 2001 From: Rahul Ghangas Date: Sat, 29 May 2021 20:01:25 +0530 Subject: [PATCH 3/5] chore: revert module name change --- redisless/src/storage/models/meta.rs | 20 ++++++++++++++++++++ redisless/src/storage/models/mod.rs | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 redisless/src/storage/models/meta.rs diff --git a/redisless/src/storage/models/meta.rs b/redisless/src/storage/models/meta.rs new file mode 100644 index 0000000..0f86843 --- /dev/null +++ b/redisless/src/storage/models/meta.rs @@ -0,0 +1,20 @@ +use super::{Expiry, RedisType}; + +pub struct RedisMeta { + pub data_type: RedisType, + pub expiry: Option, +} + +impl RedisMeta { + pub fn new(data_type: RedisType, expiry: Option) -> Self { + Self { data_type, expiry } + } + + pub fn is_expired(&self) -> bool { + if let Some(expiry) = &self.expiry { + expiry.duration_left_millis() <= 0 + } else { + false + } + } +} diff --git a/redisless/src/storage/models/mod.rs b/redisless/src/storage/models/mod.rs index 330067b..4a58ea0 100644 --- a/redisless/src/storage/models/mod.rs +++ b/redisless/src/storage/models/mod.rs @@ -1,12 +1,12 @@ pub mod expiry; pub mod hash; -pub mod zeta; +pub mod meta; // re-export so one can use with models::Expiry // rather than models::expiry::Expiry pub use expiry::Expiry; pub use hash::RedisHashMap; -pub use zeta::RedisMeta; +pub use meta::RedisMeta; pub type RedisString = Vec; From 9af4712624a73f2fab5a1214994310c2b010e7c7 Mon Sep 17 00:00:00 2001 From: Rahul Ghangas Date: Sat, 29 May 2021 20:02:24 +0530 Subject: [PATCH 4/5] chore: remove duplicate file --- redisless/src/storage/models/zeta.rs | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 redisless/src/storage/models/zeta.rs diff --git a/redisless/src/storage/models/zeta.rs b/redisless/src/storage/models/zeta.rs deleted file mode 100644 index 0f86843..0000000 --- a/redisless/src/storage/models/zeta.rs +++ /dev/null @@ -1,20 +0,0 @@ -use super::{Expiry, RedisType}; - -pub struct RedisMeta { - pub data_type: RedisType, - pub expiry: Option, -} - -impl RedisMeta { - pub fn new(data_type: RedisType, expiry: Option) -> Self { - Self { data_type, expiry } - } - - pub fn is_expired(&self) -> bool { - if let Some(expiry) = &self.expiry { - expiry.duration_left_millis() <= 0 - } else { - false - } - } -} From 085545aa609332a5be6f5d10ca4b93ea658e37ea Mon Sep 17 00:00:00 2001 From: Rahul Ghangas Date: Fri, 4 Jun 2021 15:15:17 +0530 Subject: [PATCH 5/5] fix: fix failing test --- redisless/src/server/tests/mod.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/redisless/src/server/tests/mod.rs b/redisless/src/server/tests/mod.rs index 07c3f43..4d8a68b 100644 --- a/redisless/src/server/tests/mod.rs +++ b/redisless/src/server/tests/mod.rs @@ -43,10 +43,7 @@ fn test_incr_decr_commands() { Ok(_) => panic!("got valid response from incr command for key {} and value {}", "63", "foo"), Err(error) => { assert_eq!(error.kind(), redis::ErrorKind::ExtensionError); - match error.detail() { - None => panic!("returned error was None"), - Some(error_string) => assert_eq!(error_string, "invalid digit found in string"), - } + assert_eq!(error.to_string(), "invalid: digit found in string"); } };