From c1ee7d2e7464fac36cf6729aa3f3b0c593046dcb Mon Sep 17 00:00:00 2001 From: Anand Krishnamoorthi Date: Sun, 28 Jul 2024 11:35:21 +0530 Subject: [PATCH] feat: Update to opa v0.67.0 Implement strings.count builtin Signed-off-by: Anand Krishnamoorthi --- src/builtins/strings.rs | 22 ++++++++++++++++++++++ tests/opa.rs | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/builtins/strings.rs b/src/builtins/strings.rs index 9c9cb354..611d0028 100644 --- a/src/builtins/strings.rs +++ b/src/builtins/strings.rs @@ -28,6 +28,7 @@ pub fn register(m: &mut builtins::BuiltinsMap<&'static str, builtins::BuiltinFcn m.insert("startswith", (startswith, 2)); m.insert("strings.any_prefix_match", (any_prefix_match, 2)); m.insert("strings.any_suffix_match", (any_suffix_match, 2)); + m.insert("strings.count", (strings_count, 2)); m.insert("strings.replace_n", (replace_n, 2)); m.insert("strings.reverse", (reverse, 1)); m.insert("substring", (substring, 3)); @@ -512,6 +513,27 @@ fn any_suffix_match( )) } +fn strings_count( + span: &Span, + params: &[Ref], + args: &[Value], + _strict: bool, +) -> Result { + let name = "strings.count"; + ensure_args_count(span, name, params, args, 2)?; + + let search = ensure_string(name, ¶ms[0], &args[0])?; + let substring = ensure_string(name, ¶ms[0], &args[1])?; + + Ok(Value::from( + search + .as_bytes() + .windows(substring.len()) + .filter(|&w| w == substring.as_bytes()) + .count(), + )) +} + fn startswith(span: &Span, params: &[Ref], args: &[Value], _strict: bool) -> Result { let name = "startswith"; ensure_args_count(span, name, params, args, 2)?; diff --git a/tests/opa.rs b/tests/opa.rs index 5821a0ba..8785a427 100644 --- a/tests/opa.rs +++ b/tests/opa.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use walkdir::WalkDir; const OPA_REPO: &str = "https://github.com/open-policy-agent/opa"; -const OPA_BRANCH: &str = "v0.66.0"; +const OPA_BRANCH: &str = "v0.67.0"; #[derive(Serialize, Deserialize, PartialEq, Debug)] #[serde(deny_unknown_fields)]