1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use redis_module::{Context, RedisError, RedisResult, redis_module, redis_command, RedisValue};
use regex::Regex;

fn execute_regular_expression(ctx: &Context, args: Vec<String>) -> RedisResult {
    let need_arg = args.into_iter().skip(1).map(|s| s).collect::<Vec<String>>();

    let first_arg: &str = match need_arg.get(0) {
        Some(data) => Ok(data),
        None => {
            ctx.log_debug("Not found regular expression arguments value");
            Err(RedisError::WrongArity)
        }
    }?;

    let reg = match Regex::new(first_arg) {
        Ok(reg) => {
            ctx.log_debug("Succes regular expression");
            Ok(reg)
        },
        Err(e) => {
            ctx.log_debug(
                &format!(
                    "{} error regular expression pattern",
                    e.to_string()
                )
            );
            Err(RedisError::String(format!("{}", e)))
        }
    }?;

    ctx.log_debug(&format!("{:?}", need_arg));

    let response_from_command = ctx.call("KEYS", &["*"])?;

    let result = match response_from_command {
        RedisValue::Array(data) => Ok(data),
        _ => {
            Err(RedisError::String(format!("{:?}", &response_from_command)))
        }
    }?;

    let mut result_redis_value: Vec<RedisValue> = Vec::new();
    for redis_value in result {
        let key = match redis_value {
            RedisValue::SimpleString(key) => {
                if reg.is_match(&key) {
                    Some(RedisValue::SimpleString(key))
                } else {
                    None
                }
            }
            _ => None
        };
        if key.is_some() {
            result_redis_value.push(key.unwrap());
        }
    }

    Ok(RedisValue::Array(result_redis_value))
}

redis_module!{
    name: "Regex",
    version: 0.1,
    data_types: [],
    commands: [
        ["reg", execute_regular_expression, ""],
    ]
}