shardmap 0.3.1

Sharded embedded in-memory map with optional cache, protocol, and server internals
Documentation
#[cfg(feature = "server")]
use bytes::BytesMut;

use crate::commands::redis::{define_redis_command, int, write_resp_wrong_arity, wrong_arity};
use crate::protocol::Frame;
#[cfg(feature = "server")]
use crate::server::wire::ServerWire;
use crate::storage::EmbeddedStore;

define_redis_command!(MSetNx, "MSETNX", true);

impl crate::commands::redis::RedisCommand for MSetNx {
    fn execute(store: &EmbeddedStore, args: &[&[u8]]) -> Frame {
        if args.is_empty() || !args.len().is_multiple_of(2) {
            return wrong_arity("MSETNX");
        }
        if args.chunks_exact(2).any(|pair| store.exists(pair[0])) {
            return int(0);
        }
        for pair in args.chunks_exact(2) {
            store.set(pair[0].to_vec(), pair[1].to_vec(), None);
        }
        int(1)
    }

    #[cfg(feature = "server")]
    fn write_resp(store: &EmbeddedStore, args: &[&[u8]], out: &mut BytesMut) {
        if args.is_empty() || !args.len().is_multiple_of(2) {
            write_resp_wrong_arity(out, "MSETNX");
            return;
        }
        if args.chunks_exact(2).any(|pair| store.exists(pair[0])) {
            ServerWire::write_resp_integer(out, 0);
            return;
        }
        for pair in args.chunks_exact(2) {
            store.set(pair[0].to_vec(), pair[1].to_vec(), None);
        }
        ServerWire::write_resp_integer(out, 1);
    }
}