redis_event/cmd/
hashes.rs

1/*!
2Hashes相关的命令定义、解析
3
4所有涉及到的命令参考[Redis Command Reference]
5
6[Redis Command Reference]: https://redis.io/commands#hash
7*/
8
9use std::slice::Iter;
10
11#[derive(Debug)]
12pub struct HDEL<'a> {
13    pub key: &'a [u8],
14    pub fields: Vec<&'a [u8]>,
15}
16
17pub(crate) fn parse_hdel(mut iter: Iter<Vec<u8>>) -> HDEL {
18    let key = iter.next().unwrap();
19    let mut fields = Vec::new();
20    while let Some(field) = iter.next() {
21        fields.push(field.as_slice());
22    }
23    HDEL { key, fields }
24}
25
26#[derive(Debug)]
27pub struct HINCRBY<'a> {
28    pub key: &'a [u8],
29    pub field: &'a [u8],
30    pub increment: &'a [u8],
31}
32
33pub(crate) fn parse_hincrby(mut iter: Iter<Vec<u8>>) -> HINCRBY {
34    let key = iter.next().unwrap();
35    let field = iter.next().unwrap();
36    let increment = iter.next().unwrap();
37    HINCRBY { key, field, increment }
38}
39
40#[derive(Debug)]
41pub struct HMSET<'a> {
42    pub key: &'a [u8],
43    pub fields: Vec<Field<'a>>,
44}
45
46#[derive(Debug)]
47pub struct HSET<'a> {
48    pub key: &'a [u8],
49    pub fields: Vec<Field<'a>>,
50}
51
52#[derive(Debug)]
53pub struct Field<'a> {
54    pub name: &'a [u8],
55    pub value: &'a [u8],
56}
57
58pub(crate) fn parse_hmset(mut iter: Iter<Vec<u8>>) -> HMSET {
59    let key = iter.next().unwrap();
60    let mut fields = Vec::new();
61    loop {
62        if let Some(field) = iter.next() {
63            if let Some(value) = iter.next() {
64                let field = Field { name: field, value };
65                fields.push(field);
66            } else {
67                panic!("HMSET缺失field value");
68            }
69        } else {
70            break;
71        }
72    }
73    HMSET { key, fields }
74}
75
76pub(crate) fn parse_hset(mut iter: Iter<Vec<u8>>) -> HSET {
77    let key = iter.next().unwrap();
78    let mut fields = Vec::new();
79    loop {
80        if let Some(field) = iter.next() {
81            if let Some(value) = iter.next() {
82                let field = Field { name: field, value };
83                fields.push(field);
84            } else {
85                panic!("HSET缺失field value");
86            }
87        } else {
88            break;
89        }
90    }
91    HSET { key, fields }
92}
93
94#[derive(Debug)]
95pub struct HSETNX<'a> {
96    pub key: &'a [u8],
97    pub field: &'a [u8],
98    pub value: &'a [u8],
99}
100
101pub(crate) fn parse_hsetnx(mut iter: Iter<Vec<u8>>) -> HSETNX {
102    let key = iter.next().unwrap();
103    let field = iter.next().unwrap();
104    let value = iter.next().unwrap();
105    HSETNX { key, field, value }
106}