pub struct ApprovalRule { /* private fields */ }Expand description
A conditional approval requirement.
When an approval gate opens, the rules of its
ApprovalConfig are evaluated in order against the
run context; the first rule whose condition holds
decides how many distinct approvals the gate needs and, optionally, which
groups the approvers must belong to. See Expression for the condition
syntax.
Deserialization rejects an invalid condition and required_approvers == 0.
§Examples
use ironflow_engine::config::ApprovalRule;
use serde_json::json;
let rule = ApprovalRule::new("payload.amount > 10000", 2).with_approver_groups(["finance"]);
assert_eq!(rule.required_approvers(), 2);
assert_eq!(rule.approver_groups(), ["finance".to_string()]);
assert!(rule.matches(&json!({"payload": {"amount": 15000}})));Implementations§
Source§impl ApprovalRule
impl ApprovalRule
Sourcepub fn new(condition: &str, required_approvers: usize) -> Self
pub fn new(condition: &str, required_approvers: usize) -> Self
Create a rule from a condition source and a number of approvers.
§Panics
Panics if condition is not a valid Expression or if
required_approvers is zero.
§Examples
use ironflow_engine::config::ApprovalRule;
let rule = ApprovalRule::new("labels.env == 'production'", 2);
assert_eq!(rule.condition().source(), "labels.env == 'production'");Sourcepub fn from_expression(condition: Expression, required_approvers: usize) -> Self
pub fn from_expression(condition: Expression, required_approvers: usize) -> Self
Create a rule from an already parsed Expression.
§Panics
Panics if required_approvers is zero.
§Examples
use ironflow_engine::config::ApprovalRule;
use ironflow_engine::expression::Expression;
let rule = ApprovalRule::from_expression(Expression::parse("payload.urgent")?, 3);
assert_eq!(rule.required_approvers(), 3);Sourcepub fn with_approver_groups<I, S>(self, groups: I) -> Self
pub fn with_approver_groups<I, S>(self, groups: I) -> Self
Restrict voting to members of the given groups.
Names are trimmed and deduplicated. Admins may always vote.
§Panics
Panics if a group name is empty or only whitespace.
§Examples
use ironflow_engine::config::ApprovalRule;
let rule = ApprovalRule::new("payload.amount > 10000", 2)
.with_approver_groups([" finance ", "legal", "finance"]);
assert_eq!(rule.approver_groups(), ["finance".to_string(), "legal".to_string()]);Sourcepub fn condition(&self) -> &Expression
pub fn condition(&self) -> &Expression
The condition deciding whether this rule applies.
§Examples
use ironflow_engine::config::ApprovalRule;
let rule = ApprovalRule::new("payload.urgent", 1);
assert_eq!(rule.condition().to_string(), "payload.urgent");Sourcepub fn required_approvers(&self) -> usize
pub fn required_approvers(&self) -> usize
Number of distinct approvals the gate needs when this rule applies.
§Examples
use ironflow_engine::config::ApprovalRule;
assert_eq!(ApprovalRule::new("payload.urgent", 3).required_approvers(), 3);Sourcepub fn approver_groups(&self) -> &[String]
pub fn approver_groups(&self) -> &[String]
Groups whose members may vote. Empty means no group restriction.
§Examples
use ironflow_engine::config::ApprovalRule;
assert!(ApprovalRule::new("payload.urgent", 1).approver_groups().is_empty());Sourcepub fn matches(&self, ctx: &Value) -> bool
pub fn matches(&self, ctx: &Value) -> bool
Whether the condition holds for the given context.
§Examples
use ironflow_engine::config::ApprovalRule;
use serde_json::json;
let rule = ApprovalRule::new("labels.env == 'production'", 2);
assert!(rule.matches(&json!({"labels": {"env": "production"}})));
assert!(!rule.matches(&json!({"labels": {}})));