use crate::cmd::{wrong_args, arg_f64, cmd_zrange, cmd_zrangebyscore, store_err};
use kevy_resp::{
ArgvView, RespVersion, encode_bulk, encode_double, encode_error, encode_map_header,
encode_null, encode_set_header,
};
use kevy_store::{Store, StoreError};
pub(crate) fn try_resp3_overrides<A: ArgvView + ?Sized>(
cmd: &[u8],
store: &mut Store,
args: &A,
out: &mut Vec<u8>,
) -> bool {
match cmd {
b"HGETALL" => {
if args.len() == 2 {
emit_hash_map_resp3(store.hgetall(&args[1]), out);
} else {
wrong_args(out, "hgetall");
}
true
}
b"ZSCORE" => {
if args.len() == 3 {
emit_zscore_resp3(store.zscore(&args[1], &args[2]), out);
} else {
wrong_args(out, "zscore");
}
true
}
b"ZINCRBY" => {
if args.len() != 4 {
wrong_args(out, "zincrby");
} else if let Some(incr) = arg_f64(&args[2]) {
emit_zincrby_resp3(store.zincrby(&args[1], incr, &args[3]), out);
} else {
encode_error(out, "ERR value is not a valid float");
}
true
}
b"SMEMBERS" => {
if args.len() == 2 {
emit_set_resp3(store.smembers(&args[1]), out);
} else {
wrong_args(out, "smembers");
}
true
}
b"CONFIG" => {
let cfg = crate::config_global::get();
crate::ops::config::cmd_config(&cfg, args, out, RespVersion::V3);
true
}
b"ZRANGE" => {
cmd_zrange(store, args, out, RespVersion::V3);
true
}
b"ZRANGEBYSCORE" => {
cmd_zrangebyscore(store, args, out, RespVersion::V3);
true
}
b"INFO" => {
let cfg = crate::config_global::get();
crate::ops::cmd_info(&cfg, store, args, out, RespVersion::V3);
true
}
b"CLIENT" => {
crate::ops::client::cmd_client(args, out, RespVersion::V3);
true
}
_ => false,
}
}
fn emit_hash_map_resp3(res: Result<Vec<Vec<u8>>, StoreError>, out: &mut Vec<u8>) {
match res {
Ok(flat) => {
let pairs = flat.len() / 2;
encode_map_header(out, pairs as i64);
for v in &flat {
encode_bulk(out, v);
}
}
Err(e) => store_err(out, e),
}
}
fn emit_set_resp3(res: Result<Vec<Vec<u8>>, StoreError>, out: &mut Vec<u8>) {
match res {
Ok(items) => {
encode_set_header(out, items.len() as i64);
for v in &items {
encode_bulk(out, v);
}
}
Err(e) => store_err(out, e),
}
}
fn emit_zscore_resp3(res: Result<Option<f64>, StoreError>, out: &mut Vec<u8>) {
match res {
Ok(Some(sc)) => encode_double(out, sc),
Ok(None) => encode_null(out),
Err(e) => store_err(out, e),
}
}
fn emit_zincrby_resp3(res: Result<f64, StoreError>, out: &mut Vec<u8>) {
match res {
Ok(sc) => encode_double(out, sc),
Err(e) => store_err(out, e),
}
}