diff --git a/src/main.rs b/src/main.rs index 7b161c4..fbb8d9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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, diff --git a/src/webhooks.rs b/src/webhooks.rs index efd9fb6..0c4ee15 100644 --- a/src/webhooks.rs +++ b/src/webhooks.rs @@ -93,6 +93,7 @@ impl JsonFilter { #[derive(Debug, Deserialize, Serialize)] #[serde(deny_unknown_fields, rename_all = "lowercase")] pub enum FilterType { + Not(Box), And(Vec), Or(Vec), #[serde(rename = "json")] @@ -102,6 +103,7 @@ pub enum FilterType { impl FilterType { pub fn evaluate(&self, data: &serde_json::Value) -> Result { match self { + FilterType::Not(filter) => Ok(!filter.evaluate(data)?), FilterType::And(filters) => { let (mut results, mut errors) = (Vec::new(), Vec::new());