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, ""], ] }