104 lines
3.7 KiB
Rust
104 lines
3.7 KiB
Rust
use crate::modules::{AvailableFilter,Filter,ModuleArgs};
|
|
use crate::common::Record;
|
|
use crate::common::Value;
|
|
|
|
#[derive(Debug)]
|
|
pub struct Equals {
|
|
field: String,
|
|
value: Value
|
|
}
|
|
|
|
inventory::submit! {
|
|
AvailableFilter::new("filter_equals", move |a| Box::new(Equals::from_args(a)))
|
|
}
|
|
|
|
impl Equals {
|
|
pub fn from_args(mut args: ModuleArgs) -> Equals {
|
|
Equals {
|
|
field: match args.remove("field") {
|
|
Some(Value::Str(s)) => s,
|
|
_ => panic!("The Equals filter needs a field to filter in “field”")
|
|
},
|
|
value: args.remove("value").expect("The Equals filter needs a reference value in “value”")
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Filter for Equals {
|
|
fn filter(&self, record: &mut Record) -> bool {
|
|
match (record.get(&self.field.as_ref()), &self.value) {
|
|
(Some(ref v1), ref v2) => v1 == v2,
|
|
(None, _) => false
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use chrono::Utc;
|
|
use std::collections::HashMap;
|
|
use crate::common::{Record,Value};
|
|
use crate::filters::Equals;
|
|
use crate::modules::{Filter,ModuleArgs};
|
|
|
|
fn generate_args_record_equal<'a>(name: &'a str, value: Value) -> (ModuleArgs, Record<'a>) {
|
|
let mut args = HashMap::with_capacity(2);
|
|
args.insert(String::from("field"), Value::Str(String::from(name)));
|
|
args.insert(String::from("value"), value.clone());
|
|
let mut record = HashMap::with_capacity(1);
|
|
record.insert(name, value);
|
|
(args, record)
|
|
}
|
|
|
|
fn generate_args_record_custom<'a>(ref_name: &str, ref_value: Value, test_name: &'a str, test_value: Value) -> (ModuleArgs, Record<'a>) {
|
|
let mut args = HashMap::with_capacity(2);
|
|
args.insert(String::from("field"), Value::Str(String::from(ref_name)));
|
|
args.insert(String::from("value"), ref_value);
|
|
let mut record = HashMap::with_capacity(1);
|
|
record.insert(test_name, test_value);
|
|
(args, record)
|
|
}
|
|
|
|
#[test]
|
|
fn filter_equals_should_return_true() {
|
|
let (args, mut record) = generate_args_record_equal("a_boolean", Value::Bool(false));
|
|
let filter = Equals::from_args(args);
|
|
assert!(filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_equal("a_string", Value::Str(String::from("Hello!")));
|
|
let filter = Equals::from_args(args);
|
|
assert!(filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_equal("an_integer", Value::Int(2));
|
|
let filter = Equals::from_args(args);
|
|
assert!(filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_equal("a_date", Value::Date(Utc::now()));
|
|
let filter = Equals::from_args(args);
|
|
assert!(filter.filter(&mut record));
|
|
}
|
|
|
|
#[test]
|
|
fn filter_equals_should_return_false() {
|
|
let (args, mut record) = generate_args_record_custom("a_boolean", Value::Bool(true), "a_boolean", Value::Bool(false));
|
|
let filter = Equals::from_args(args);
|
|
assert!(! filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_custom("a_string", Value::Str(String::from("Hello!")), "a_string", Value::Str(String::from("World!")));
|
|
let filter = Equals::from_args(args);
|
|
assert!(! filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_custom("an_integer", Value::Int(2), "an_integer", Value::Int(3));
|
|
let filter = Equals::from_args(args);
|
|
assert!(! filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_custom("a_date", Value::Date(Utc::now()), "a_date", Value::Date(Utc::now()));
|
|
let filter = Equals::from_args(args);
|
|
assert!(! filter.filter(&mut record));
|
|
|
|
let (args, mut record) = generate_args_record_custom("first_one", Value::Int(1), "second_one", Value::Int(1));
|
|
let filter = Equals::from_args(args);
|
|
assert!(! filter.filter(&mut record));
|
|
}
|
|
}
|