redis_event/cmd/
scripting.rs

1/*!
2Scripting相关的命令定义、解析
3
4所有涉及到的命令参考[Redis Command Reference]
5
6[Redis Command Reference]: https://redis.io/commands#scripting
7*/
8
9use std::slice::Iter;
10
11#[derive(Debug)]
12pub struct EVAL<'a> {
13    pub script: &'a [u8],
14    pub num_keys: i32,
15    pub keys: Vec<&'a [u8]>,
16    pub args: Vec<&'a [u8]>,
17}
18
19pub(crate) fn parse_eval(mut iter: Iter<Vec<u8>>) -> EVAL {
20    let script = iter.next().unwrap();
21    let num_keys = iter.next().unwrap();
22    let num_keys = String::from_utf8_lossy(num_keys).parse::<i32>().unwrap();
23    let mut keys = Vec::with_capacity(num_keys as usize);
24    for _ in 0..num_keys {
25        let key = iter.next().unwrap();
26        keys.push(key.as_slice());
27    }
28    let mut args = Vec::new();
29    while let Some(arg) = iter.next() {
30        args.push(arg.as_slice());
31    }
32    EVAL {
33        script,
34        num_keys,
35        keys,
36        args,
37    }
38}
39
40#[derive(Debug)]
41pub struct EVALSHA<'a> {
42    pub sha1: &'a [u8],
43    pub num_keys: i32,
44    pub keys: Vec<&'a [u8]>,
45    pub args: Vec<&'a [u8]>,
46}
47
48pub(crate) fn parse_evalsha(mut iter: Iter<Vec<u8>>) -> EVALSHA {
49    let sha1 = iter.next().unwrap();
50    let num_keys = iter.next().unwrap();
51    let num_keys = String::from_utf8_lossy(num_keys).parse::<i32>().unwrap();
52    let mut keys = Vec::with_capacity(num_keys as usize);
53    for _ in 0..num_keys {
54        let key = iter.next().unwrap();
55        keys.push(key.as_slice());
56    }
57    let mut args = Vec::new();
58    while let Some(arg) = iter.next() {
59        args.push(arg.as_slice());
60    }
61    EVALSHA {
62        sha1,
63        num_keys,
64        keys,
65        args,
66    }
67}
68
69#[derive(Debug)]
70pub struct SCRIPTLOAD<'a> {
71    pub script: &'a [u8],
72}
73
74pub(crate) fn parse_script_load(mut iter: Iter<Vec<u8>>) -> SCRIPTLOAD {
75    let script = iter.next().unwrap();
76    SCRIPTLOAD { script }
77}