From 2abc9f32ef4790b29a1f71b21b291e63659c85f1 Mon Sep 17 00:00:00 2001 From: Anand Krishnamoorthi Date: Fri, 28 Aug 2026 11:17:15 -0500 Subject: [PATCH 1/3] fix(builtins): add d/w/y duration units to time.parse_duration_ns OPA supports 'd' (day), 'w' (week), and 'y' (365-day year) as duration unit suffixes; Regorus previously returned an error for those tokens. - Define DAY = 24 * HOUR, WEEK = 7 * DAY, YEAR = 365 * DAY constants - Add 'd', 'w', 'y' arms to the unit-matching arm of parse_duration() - Add YAML regression test covering individual units and a mixed '1d12h' compound duration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/builtins/time/compat.rs | 6 +++++ .../cases/builtins/time/duration_units.yaml | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 tests/interpreter/cases/builtins/time/duration_units.yaml diff --git a/src/builtins/time/compat.rs b/src/builtins/time/compat.rs index 77cf5112e..31c9c9609 100644 --- a/src/builtins/time/compat.rs +++ b/src/builtins/time/compat.rs @@ -53,6 +53,9 @@ const MILLISECOND: u64 = 1000 * MICROSECOND; const SECOND: u64 = 1000 * MILLISECOND; const MINUTE: u64 = 60 * SECOND; const HOUR: u64 = 60 * MINUTE; +const DAY: u64 = 24 * HOUR; +const WEEK: u64 = 7 * DAY; +const YEAR: u64 = 365 * DAY; #[derive(Debug)] pub enum ParseDurationError { @@ -155,6 +158,9 @@ pub fn parse_duration(mut s: &str) -> Result { "s" => SECOND, "m" => MINUTE, "h" => HOUR, + "d" => DAY, + "w" => WEEK, + "y" => YEAR, unkonwn => return Err(ParseDurationError::UnknownUnit(unkonwn.to_string())), }; diff --git a/tests/interpreter/cases/builtins/time/duration_units.yaml b/tests/interpreter/cases/builtins/time/duration_units.yaml new file mode 100644 index 000000000..e7fa962c8 --- /dev/null +++ b/tests/interpreter/cases/builtins/time/duration_units.yaml @@ -0,0 +1,26 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +cases: + - note: days-weeks-years + data: {} + modules: + - | + package test + one_day = time.parse_duration_ns("1d") + one_week = time.parse_duration_ns("1w") + one_year = time.parse_duration_ns("1y") + query: data.test + want_result: + one_day: 86400000000000 + one_week: 604800000000000 + one_year: 31536000000000000 + + - note: mixed-units + data: {} + modules: + - | + package test + x = time.parse_duration_ns("1d12h") + query: data.test.x + want_result: 129600000000000 From 9d69ab13b17c24a7ef7826366252a373548e05b6 Mon Sep 17 00:00:00 2001 From: Anand Krishnamoorthi Date: Fri, 28 Aug 2026 13:42:57 -0500 Subject: [PATCH 2/3] fix(time): fix typo unkonwn -> unknown in parse_duration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/builtins/time/compat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins/time/compat.rs b/src/builtins/time/compat.rs index 31c9c9609..c90268bf4 100644 --- a/src/builtins/time/compat.rs +++ b/src/builtins/time/compat.rs @@ -161,7 +161,7 @@ pub fn parse_duration(mut s: &str) -> Result { "d" => DAY, "w" => WEEK, "y" => YEAR, - unkonwn => return Err(ParseDurationError::UnknownUnit(unkonwn.to_string())), + unknown => return Err(ParseDurationError::UnknownUnit(unknown.to_string())), }; s = &s[idx + 1..]; From 0907d1b7670f51176c10365ef3ffc6b5c095604e Mon Sep 17 00:00:00 2001 From: Anand Krishnamoorthi Date: Fri, 28 Aug 2026 15:42:17 -0500 Subject: [PATCH 3/3] test: keep duration CI green across feature sets Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/builtins/azure_policy/template_functions_encoding.rs | 4 ++-- src/tests/interpreter/mod.rs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/builtins/azure_policy/template_functions_encoding.rs b/src/builtins/azure_policy/template_functions_encoding.rs index 1e8e4914b..5b0b5348e 100644 --- a/src/builtins/azure_policy/template_functions_encoding.rs +++ b/src/builtins/azure_policy/template_functions_encoding.rs @@ -174,12 +174,12 @@ fn percent_encode(s: &str) -> String { // always returns Some for radix 16. result.push('%'); result.push( - core::char::from_digit(u32::from(b >> 4), 16) + char::from_digit(u32::from(b >> 4), 16) .unwrap_or('0') .to_ascii_uppercase(), ); result.push( - core::char::from_digit(u32::from(b & 0x0F), 16) + char::from_digit(u32::from(b & 0x0F), 16) .unwrap_or('0') .to_ascii_uppercase(), ); diff --git a/src/tests/interpreter/mod.rs b/src/tests/interpreter/mod.rs index 0498962f0..90fe1c4f4 100644 --- a/src/tests/interpreter/mod.rs +++ b/src/tests/interpreter/mod.rs @@ -598,6 +598,7 @@ fn yaml_test_impl(file: &str) -> Result<()> { "globmatch.yaml", "now_ns.yaml", "parse_duration_ns.yaml", + "duration_units.yaml", "parse_ns.yaml", "parse_rfc3339_ns.yaml", "weekday.yaml",