redis_imitate/commands/
parser.rs1#[derive(Debug,PartialEq,Clone)]
10pub enum Command {
11 Set(String, String),
12 Get(String),
13 Del(String),
14 Incr(String),
15 Decr(String),
16 LPush(String, String),
17 RPush(String, String),
18 LPop(String),
19 RPop(String),
20 LLen(String),
21 Multi,
22 Exec,
23 Discard,
24 Unknown(String),
25}
26
27pub struct CommandParser;
32
33impl CommandParser {
34 pub fn parse(input: &str) -> Command {
60 let parts: Vec<&str> = input.trim().split_whitespace().collect();
61 match parts.as_slice() {
62 [command, rest @ ..] => match command.to_uppercase().as_str() {
63 "SET" if rest.len() == 2 => Command::Set(rest[0].to_lowercase(), rest[1].to_string()),
64 "GET" if rest.len() == 1 => Command::Get(rest[0].to_lowercase()),
65 "DEL" if rest.len() == 1 => Command::Del(rest[0].to_lowercase()),
66 "INCR" if rest.len() == 1 => Command::Incr(rest[0].to_lowercase()),
67 "DECR" if rest.len() == 1 => Command::Decr(rest[0].to_lowercase()),
68 "LPUSH" if rest.len() == 2 => Command::LPush(rest[0].to_lowercase(), rest[1].to_string()),
69 "RPUSH" if rest.len() == 2 => Command::RPush(rest[0].to_lowercase(), rest[1].to_string()),
70 "LPOP" if rest.len() == 1 => Command::LPop(rest[0].to_lowercase()),
71 "RPOP" if rest.len() == 1 => Command::RPop(rest[0].to_lowercase()),
72 "LLEN" if rest.len() == 1 => Command::LLen(rest[0].to_lowercase()),
73 "MULTI" if rest.is_empty() => Command::Multi,
74 "EXEC" if rest.is_empty() => Command::Exec,
75 "DISCARD" if rest.is_empty() => Command::Discard,
76 _ => Command::Unknown(input.to_string()),
77 },
78 _ => Command::Unknown("".to_string()),
79 }
80 }
81}