use std::convert::TryFrom;
use ntex::util::{Bytes, HashMap};
use super::{utils, Command, CommandError};
use crate::codec::{BulkString, Request, Response};
pub fn HGet<T, V>(key: T, field: V) -> utils::BulkOutputCommand
where
BulkString: From<T> + From<V>,
{
utils::BulkOutputCommand(Request::Array(vec![
Request::from_static("HGET"),
Request::BulkString(key.into()),
Request::BulkString(field.into()),
]))
}
pub fn HGetAll<T>(key: T) -> HGetAllCommand
where
BulkString: From<T>,
{
HGetAllCommand(vec![
Request::from_static("HGETALL"),
Request::BulkString(key.into()),
])
}
pub struct HGetAllCommand(Vec<Request>);
impl Command for HGetAllCommand {
type Output = HashMap<Bytes, Bytes>;
fn to_request(self) -> Request {
Request::Array(self.0)
}
fn to_output(val: Response) -> Result<Self::Output, CommandError> {
Ok(HashMap::try_from(val)?)
}
}
pub fn HSet<T, K, V>(key: T, field: K, value: V) -> HSetCommand
where
BulkString: From<T> + From<K> + From<V>,
{
HSetCommand(vec![
Request::from_static("HSET"),
Request::BulkString(key.into()),
Request::BulkString(field.into()),
Request::BulkString(value.into()),
])
}
pub struct HSetCommand(Vec<Request>);
impl HSetCommand {
pub fn entry<K, V>(mut self, field: K, value: V) -> Self
where
BulkString: From<K> + From<V>,
{
self.0.push(field.into());
self.0.push(value.into());
self
}
pub fn add_entry<K, V>(&mut self, field: K, value: V)
where
BulkString: From<K> + From<V>,
{
self.0.push(field.into());
self.0.push(value.into());
}
}
impl Command for HSetCommand {
type Output = usize;
fn to_request(self) -> Request {
Request::Array(self.0)
}
fn to_output(val: Response) -> Result<Self::Output, CommandError> {
match val {
Response::Integer(val) => Ok(val as usize),
_ => Err(CommandError::Output("Cannot parse response", val)),
}
}
}
pub fn HDel<T, K>(key: T, field: K) -> HDelCommand
where
BulkString: From<T> + From<K>,
{
HDelCommand(vec![
Request::from_static("HDEL"),
Request::BulkString(key.into()),
Request::BulkString(field.into()),
])
}
pub struct HDelCommand(Vec<Request>);
impl HDelCommand {
pub fn remove<K>(mut self, field: K) -> Self
where
BulkString: From<K>,
{
self.0.push(field.into());
self
}
pub fn remove_all<T>(mut self, other: impl IntoIterator<Item = T>) -> Self
where
BulkString: From<T>,
{
self.0.extend(other.into_iter().map(|t| t.into()));
self
}
}
impl Command for HDelCommand {
type Output = usize;
fn to_request(self) -> Request {
Request::Array(self.0)
}
fn to_output(val: Response) -> Result<Self::Output, CommandError> {
match val {
Response::Integer(val) => Ok(val as usize),
_ => Err(CommandError::Output("Cannot parse response", val)),
}
}
}
pub fn HLen<T>(key: T) -> utils::IntOutputCommand
where
BulkString: From<T>,
{
utils::IntOutputCommand(Request::Array(vec![
Request::from_static("HLEN"),
Request::BulkString(key.into()),
]))
}
pub fn HIncrBy<T, K, I>(key: T, field: K, increment: I) -> utils::IntOutputCommand
where
BulkString: From<T> + From<K>,
i64: From<I>,
{
utils::IntOutputCommand(Request::Array(vec![
Request::from_static("HINCRBY"),
Request::BulkString(key.into()),
Request::BulkString(field.into()),
Request::BulkString(i64::from(increment).to_string().into()),
]))
}