aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoromagdy <omar.professional8777@gmail.com>2025-07-23 01:11:12 +0300
committeromagdy <omar.professional8777@gmail.com>2025-07-23 01:11:12 +0300
commitc94f86353dd98a176b61806eb4f25c9170c26717 (patch)
tree8425cb5ed8733a979aa3618fea8fc9bb957aedc3 /src
parent7dbaa99eb721748f5eff2839817c6742029ad2b3 (diff)
downloadredis-rust-c94f86353dd98a176b61806eb4f25c9170c26717.tar.xz
redis-rust-c94f86353dd98a176b61806eb4f25c9170c26717.zip
feat: Added simple logic to check if redis node role is master or slave
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs48
-rw-r--r--src/main.rs3
-rw-r--r--src/resp_commands.rs8
3 files changed, 52 insertions, 7 deletions
diff --git a/src/lib.rs b/src/lib.rs
index e43bbf6..94e7a20 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,11 +7,30 @@ pub mod resp_commands;
pub mod resp_parser;
pub mod shared_cache;
+#[derive(Debug, Clone, Default)]
+pub struct RedisServer {
+ pub role: String,
+ pub port: String,
+ pub master_host: String,
+ pub master_port: String,
+}
+
+impl RedisServer {
+ fn new() -> Self {
+ Self {
+ role: "master".to_string(),
+ port: "6379".to_string(),
+ master_host: "".to_string(),
+ master_port: "".to_string(),
+ }
+ }
+}
+
#[derive(Debug, Default)]
pub struct Config {
pub dir: Option<String>,
pub dbfilename: Option<String>,
- pub port: Option<String>,
+ pub server: RedisServer,
}
pub type SharedConfig = Arc<Option<Config>>;
@@ -26,7 +45,7 @@ impl Config {
let mut dir = None;
let mut dbfilename = None;
- let mut port = None;
+ let mut redis_server = RedisServer::new();
let mut i = 1; // Skip program name
while i < args.len() {
@@ -47,9 +66,28 @@ impl Config {
}
"--port" => {
if i + 1 >= args.len() {
- return Err("--dbfilename requires a value".to_string());
+ return Err("--port requires a value".to_string());
}
- port = Some(args[i + 1].clone());
+ redis_server.port = args[i + 1].clone();
+ i += 2;
+ }
+ "--replicaof" => {
+ if i + 1 >= args.len() {
+ return Err("--replicaof requires a value".to_string());
+ }
+
+ // TODO: Find a better name for this variable
+ let info = args[i + 1].clone();
+
+ let (master_host, master_port) = info
+ .strip_prefix('"')
+ .and_then(|x| x.strip_suffix('"'))
+ .and_then(|x| x.split_once(' '))
+ .unwrap_or(("", ""));
+
+ redis_server.role = "slave".to_string();
+ redis_server.master_host = master_host.to_string();
+ redis_server.master_port = master_port.to_string();
i += 2;
}
_ => {
@@ -61,7 +99,7 @@ impl Config {
Ok(Some(Config {
dir,
dbfilename,
- port,
+ server: redis_server,
}))
}
}
diff --git a/src/main.rs b/src/main.rs
index 5fdd6c3..3186b6c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -67,7 +67,8 @@ fn main() -> std::io::Result<()> {
let mut cache = cache.lock().unwrap();
let dir = conf.dir.clone().unwrap_or("".to_string());
let dbfilename = conf.dbfilename.clone().unwrap_or("".to_string());
- port = conf.port.clone().unwrap_or("6379".to_string());
+ let redis_server = conf.server.clone();
+ port = redis_server.port.clone();
if let Ok(rdb_file) = RDBFile::read(dir, dbfilename) {
if let Some(rdb) = rdb_file {
let hash_table = &rdb.databases.get(&0).unwrap().hash_table;
diff --git a/src/resp_commands.rs b/src/resp_commands.rs
index 0fa6945..2ca9e02 100644
--- a/src/resp_commands.rs
+++ b/src/resp_commands.rs
@@ -236,7 +236,13 @@ impl RedisCommands {
}
RC::Info(_sub_command) => {
use RespType as RT;
- RT::BulkString("# Replication\r\nrole:master".as_bytes().to_vec()).to_resp_bytes()
+ let config = config.clone();
+ let mut role = "master".to_string();
+ if let Some(conf) = config.as_ref() {
+ role = conf.server.clone().role;
+ }
+ let response = format!("# Replication\r\nrole:{role}",).as_bytes().to_vec();
+ RT::BulkString(response).to_resp_bytes()
}
RC::Invalid => todo!(),
}