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 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/macros.rs (limited to 'src/macros.rs') 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() + }; +} -- cgit v1.2.3