use kevy_resp::{ArgvView, encode_error, encode_integer, encode_simple_string};
use kevy_store::{RenameOutcome, Store};
use crate::cmd::wrong_args;
pub(crate) fn replay_mset<A: ArgvView + ?Sized>(store: &mut Store, args: &A, out: &mut Vec<u8>) {
if args.len() < 3 || args.len().is_multiple_of(2) {
return wrong_args(out, "mset");
}
let mut i = 1;
while i + 1 < args.len() {
store.set(&args[i], args[i + 1].to_vec(), None, false, false);
i += 2;
}
encode_simple_string(out, "OK");
}
pub(crate) fn replay_rename<A: ArgvView + ?Sized>(
store: &mut Store,
args: &A,
nx: bool,
out: &mut Vec<u8>,
) {
if args.len() != 3 {
return wrong_args(out, if nx { "renamenx" } else { "rename" });
}
match store.rename(&args[1], &args[2], nx) {
RenameOutcome::Renamed if nx => encode_integer(out, 1),
RenameOutcome::Renamed => encode_simple_string(out, "OK"),
RenameOutcome::DstExists => encode_integer(out, 0),
RenameOutcome::NoSuchSrc => encode_error(out, "ERR no such key"),
}
}
pub(crate) fn dispatch_multikey_stub<A: ArgvView + ?Sized>(
cmd: &[u8],
store: &mut Store,
args: &A,
out: &mut Vec<u8>,
) -> bool {
match cmd {
b"MSET" => replay_mset(store, args, out),
b"RENAME" => replay_rename(store, args, false, out),
b"RENAMENX" => replay_rename(store, args, true, out),
b"MGET" => wrong_args(out, "mget"),
b"SINTER" => wrong_args(out, "sinter"),
b"SUNION" => wrong_args(out, "sunion"),
b"SDIFF" => wrong_args(out, "sdiff"),
b"KEYS" => wrong_args(out, "keys"),
b"SCAN" => wrong_args(out, "scan"),
b"RANDOMKEY" => wrong_args(out, "randomkey"),
b"SUBSCRIBE" => wrong_args(out, "subscribe"),
b"PUBLISH" => wrong_args(out, "publish"),
_ => return false,
}
true
}