From c880c7ad3eba9546ce95bc268218c66a128d319f Mon Sep 17 00:00:00 2001 From: omagdy Date: Thu, 17 Jul 2025 03:44:03 +0300 Subject: refactor: moved macros to their own file --- src/macros.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ src/resp_commands.rs | 92 +--------------------------------------------------- 3 files changed, 92 insertions(+), 91 deletions(-) create mode 100644 src/macros.rs (limited to 'src') diff --git a/src/macros.rs b/src/macros.rs new file mode 100644 index 0000000..bc4f572 --- /dev/null +++ b/src/macros.rs @@ -0,0 +1,89 @@ +#[macro_use] +#[macro_export] +macro_rules! resp { + // Null: resp!(null) + (null) => { + $crate::RespType::Null().to_resp_bytes() + }; + + // Simple String: resp!("PONG") or resp!(simple "PONG") + (simple $s:expr) => { + $crate::RespType::SimpleString($s.to_string()).to_resp_bytes() + }; + ($s:expr) => { + $crate::RespType::SimpleString($s.to_string()).to_resp_bytes() + }; + + // Simple Error: resp!(error "ERR message") + (error $s:expr) => { + $crate::RespType::SimpleError($s.to_string()).to_resp_bytes() + }; + + // Integer: resp!(int 123) + (int $i:expr) => { + $crate::RespType::Integer($i).to_resp_bytes() + }; + + // Bulk String: resp!(bulk "hello") or resp!(bulk vec![104, 101, 108, 108, 111]) + (bulk $s:expr) => { + $crate::RespType::BulkString($s.into()).to_resp_bytes() + }; + + // Array: resp!(array [resp!("one"), resp!(int 2)]) + (array [$($elem:expr),*]) => { + $crate::RespType::Array(vec![$($elem),*]).to_resp_bytes() + }; + + // Boolean: resp!(bool true) + (bool $b:expr) => { + $crate::RespType::Boolean($b).to_resp_bytes() + }; + + // Double: resp!(double 3.14) + (double $d:expr) => { + $crate::RespType::Doubles($d).to_resp_bytes() + }; + + // Big Number: resp!(bignumber "123456789") + (bignumber $n:expr) => { + $crate::RespType::BigNumbers($n.to_string()).to_resp_bytes() + }; + + // Bulk Error: resp!(bulkerror [resp!("err1"), resp!("err2")]) + (bulkerror [$($elem:expr),*]) => { + $crate::RespType::BulkErrors(vec![$($elem),*]).to_resp_bytes() + }; + + // Verbatim String: resp!(verbatim [resp!("txt"), resp!("example")]) + (verbatim [$($elem:expr),*]) => { + $crate::RespType::VerbatimStrings(vec![$($elem),*]).to_resp_bytes() + }; + + // Map: resp!(map {resp!("key") => resp!("value")}) + (map {$($key:expr => $value:expr),*}) => { + $crate::RespType::Maps({ + let mut map = HashMap::new(); + $(map.insert($key, $value);)* + map + }).to_resp_bytes() + }; + + // Attributes: resp!(attributes [resp!("key"), resp!("value")]) + (attributes [$($elem:expr),*]) => { + $crate::RespType::Attributes(vec![$($elem),*]).to_resp_bytes() + }; + + // Set: resp!(set [resp!("one"), resp!("two")]) + (set [$($elem:expr),*]) => { + $crate::RespType::Sets({ + let mut set = HashSet::new(); + $(set.insert($elem);)* + set + }).to_resp_bytes() + }; + + // Push: resp!(push [resp!("event"), resp!("data")]) + (push [$($elem:expr),*]) => { + $crate::RespType::Pushes(vec![$($elem),*]).to_resp_bytes() + }; +} diff --git a/src/main.rs b/src/main.rs index 6905f11..c6c8720 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,8 @@ use std::{ time::{Duration, SystemTime, UNIX_EPOCH}, }; +#[macro_use] +mod macros; mod resp_commands; mod resp_parser; diff --git a/src/resp_commands.rs b/src/resp_commands.rs index 52167cc..2663cc5 100644 --- a/src/resp_commands.rs +++ b/src/resp_commands.rs @@ -1,97 +1,7 @@ -use crate::CacheEntry; -use crate::{resp_parser::*, SharedCache}; +use crate::{macros::*, resp_parser::*, CacheEntry, SharedCache}; use std::collections::{HashMap, HashSet}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -#[macro_export] -macro_rules! resp { - // Null: resp!(null) - (null) => { - $crate::RespType::Null().to_resp_bytes() - }; - - // Simple String: resp!("PONG") or resp!(simple "PONG") - (simple $s:expr) => { - $crate::RespType::SimpleString($s.to_string()).to_resp_bytes() - }; - ($s:expr) => { - $crate::RespType::SimpleString($s.to_string()).to_resp_bytes() - }; - - // Simple Error: resp!(error "ERR message") - (error $s:expr) => { - $crate::RespType::SimpleError($s.to_string()).to_resp_bytes() - }; - - // Integer: resp!(int 123) - (int $i:expr) => { - $crate::RespType::Integer($i).to_resp_bytes() - }; - - // Bulk String: resp!(bulk "hello") or resp!(bulk vec![104, 101, 108, 108, 111]) - (bulk $s:expr) => { - $crate::RespType::BulkString($s.into()).to_resp_bytes() - }; - - // Array: resp!(array [resp!("one"), resp!(int 2)]) - (array [$($elem:expr),*]) => { - $crate::RespType::Array(vec![$($elem),*]).to_resp_bytes() - }; - - // Boolean: resp!(bool true) - (bool $b:expr) => { - $crate::RespType::Boolean($b).to_resp_bytes() - }; - - // Double: resp!(double 3.14) - (double $d:expr) => { - $crate::RespType::Doubles($d).to_resp_bytes() - }; - - // Big Number: resp!(bignumber "123456789") - (bignumber $n:expr) => { - $crate::RespType::BigNumbers($n.to_string()).to_resp_bytes() - }; - - // Bulk Error: resp!(bulkerror [resp!("err1"), resp!("err2")]) - (bulkerror [$($elem:expr),*]) => { - $crate::RespType::BulkErrors(vec![$($elem),*]).to_resp_bytes() - }; - - // Verbatim String: resp!(verbatim [resp!("txt"), resp!("example")]) - (verbatim [$($elem:expr),*]) => { - $crate::RespType::VerbatimStrings(vec![$($elem),*]).to_resp_bytes() - }; - - // Map: resp!(map {resp!("key") => resp!("value")}) - (map {$($key:expr => $value:expr),*}) => { - $crate::RespType::Maps({ - let mut map = HashMap::new(); - $(map.insert($key, $value);)* - map - }).to_resp_bytes() - }; - - // Attributes: resp!(attributes [resp!("key"), resp!("value")]) - (attributes [$($elem:expr),*]) => { - $crate::RespType::Attributes(vec![$($elem),*]).to_resp_bytes() - }; - - // Set: resp!(set [resp!("one"), resp!("two")]) - (set [$($elem:expr),*]) => { - $crate::RespType::Sets({ - let mut set = HashSet::new(); - $(set.insert($elem);)* - set - }).to_resp_bytes() - }; - - // Push: resp!(push [resp!("event"), resp!("data")]) - (push [$($elem:expr),*]) => { - $crate::RespType::Pushes(vec![$($elem),*]).to_resp_bytes() - }; -} - #[derive(Debug, Clone)] pub enum SetCondition { /// NX - only set if key doesn't exists -- cgit v1.2.3