Add Not filter to FilterType

To invert the result of filters.
This commit is contained in:
finga 2021-11-17 14:06:07 +01:00
parent 4d39488c32
commit 9c423b8dc8
2 changed files with 19 additions and 2 deletions

View file

@ -679,7 +679,7 @@ mod tests {
let mut hooks = BTreeMap::new();
hooks.insert(
"test_hook".to_string(),
"test_hook0".to_string(),
Hook {
command:
"/usr/bin/echo {{ /repository/full_name }} --foo {{ /pull_request/base/ref }}"
@ -695,7 +695,7 @@ mod tests {
);
hooks.insert(
"test_hook".to_string(),
"test_hook2".to_string(),
Hook {
command: "/usr/bin/echo {{ /repository/full_name }} {{ /pull_request/base/ref }}"
.to_string(),
@ -709,6 +709,21 @@ mod tests {
},
);
hooks.insert(
"test_hook3".to_string(),
Hook {
command: "/usr/bin/echo {{ /repository/full_name }} {{ /pull_request/base/ref }}"
.to_string(),
signature: "X-Gitea-Signature".to_string(),
ip_filter: None,
secrets: vec!["valid".to_string()],
filter: FilterType::Not(Box::new(FilterType::JsonFilter(JsonFilter {
pointer: "/foobar".to_string(),
regex: "bar".to_string(),
}))),
},
);
let config = Config {
metrics: None,
hooks: hooks,

View file

@ -93,6 +93,7 @@ impl JsonFilter {
#[derive(Debug, Deserialize, Serialize)]
#[serde(deny_unknown_fields, rename_all = "lowercase")]
pub enum FilterType {
Not(Box<FilterType>),
And(Vec<FilterType>),
Or(Vec<FilterType>),
#[serde(rename = "json")]
@ -102,6 +103,7 @@ pub enum FilterType {
impl FilterType {
pub fn evaluate(&self, data: &serde_json::Value) -> Result<bool, WebhookeyError> {
match self {
FilterType::Not(filter) => Ok(!filter.evaluate(data)?),
FilterType::And(filters) => {
let (mut results, mut errors) = (Vec::new(), Vec::new());