pub struct HumanInputConfig { /* private fields */ }Expand description
Configuration for a typed human input step.
When the workflow reaches a human input step, the run transitions to
AwaitingApproval and waits for a human to submit an answer matching the
JSON schema of the expected type, or to reject the request, via the API.
The step reuses the approval gate machinery: a deadline, an escalation
policy, an assignee and the Approvers allowed to answer. The first valid
answer wins; Approvers::at_least only restricts who may answer.
A human input cannot be auto-approved on timeout since there is no value to
fill in: on_timeout refuses
EscalationPolicy::AutoApprove.
§Examples
use std::time::Duration;
use ironflow_engine::config::{EscalationPolicy, HumanInputConfig};
let config = HumanInputConfig::new("Answer the clarification questions")
.with_deadline(Duration::from_secs(3600))
.on_timeout(EscalationPolicy::AutoReject);
assert_eq!(config.message(), "Answer the clarification questions");
assert_eq!(config.deadline_secs(), Some(3600));Implementations§
Source§impl HumanInputConfig
impl HumanInputConfig
Sourcepub fn new(message: &str) -> Self
pub fn new(message: &str) -> Self
Create a new human input config with the given message.
§Examples
use ironflow_engine::config::HumanInputConfig;
let config = HumanInputConfig::new("Which environment?");
assert_eq!(config.message(), "Which environment?");Sourcepub fn with_deadline(self, deadline: Duration) -> Self
pub fn with_deadline(self, deadline: Duration) -> Self
Set the SLA deadline of this input.
Sub-second precision is dropped: the deadline is stored in whole seconds.
§Panics
Panics if deadline rounds down to zero seconds.
§Examples
use std::time::Duration;
use ironflow_engine::config::HumanInputConfig;
let config = HumanInputConfig::new("Answer?").with_deadline(Duration::from_secs(1800));
assert_eq!(config.deadline(), Some(Duration::from_secs(1800)));Sourcepub fn with_deadline_secs(self, secs: u64) -> Self
pub fn with_deadline_secs(self, secs: u64) -> Self
Sourcepub fn on_timeout(self, policy: EscalationPolicy) -> Self
pub fn on_timeout(self, policy: EscalationPolicy) -> Self
Set the policy applied when the deadline fires.
§Panics
Panics if the policy is EscalationPolicy::AutoApprove or a
EscalationPolicy::Chain containing it: a human input has no value
to fill in automatically.
§Examples
use ironflow_engine::config::{EscalationPolicy, HumanInputConfig};
let config = HumanInputConfig::new("Answer?")
.with_deadline_secs(3600)
.on_timeout(EscalationPolicy::AutoReject);
assert_eq!(config.effective_policy(), EscalationPolicy::AutoReject);use ironflow_engine::config::{EscalationPolicy, HumanInputConfig};
let _ = HumanInputConfig::new("Answer?").on_timeout(EscalationPolicy::AutoApprove);Sourcepub fn assigned_to(self, assignee: Assignee) -> Self
pub fn assigned_to(self, assignee: Assignee) -> Self
Assign the input to a user or group.
§Panics
Panics if the assignee name is empty or only whitespace.
§Examples
use ironflow_engine::config::HumanInputConfig;
use ironflow_store::entities::Assignee;
let config = HumanInputConfig::new("Answer?").assigned_to(Assignee::user("alice"));
assert_eq!(config.assignee(), Some(&Assignee::user("alice")));Sourcepub fn requiring(self, approvers: Approvers) -> Self
pub fn requiring(self, approvers: Approvers) -> Self
Restrict who may answer. A later call replaces an earlier one.
The first valid answer resolves the step, whatever the required count.
§Examples
use ironflow_engine::config::{Approvers, HumanInputConfig};
let config = HumanInputConfig::new("Answer?")
.requiring(Approvers::any().from_groups(["product"]));
assert!(config.approvers().is_some());Sourcepub fn message(&self) -> &str
pub fn message(&self) -> &str
The message displayed to the person answering.
§Examples
use ironflow_engine::config::HumanInputConfig;
assert_eq!(HumanInputConfig::new("Answer?").message(), "Answer?");Sourcepub fn deadline(&self) -> Option<Duration>
pub fn deadline(&self) -> Option<Duration>
The configured SLA deadline, if any.
§Examples
use std::time::Duration;
use ironflow_engine::config::HumanInputConfig;
let config = HumanInputConfig::new("Answer?").with_deadline_secs(60);
assert_eq!(config.deadline(), Some(Duration::from_secs(60)));Sourcepub fn deadline_secs(&self) -> Option<u64>
pub fn deadline_secs(&self) -> Option<u64>
The configured SLA deadline in seconds, if any.
§Examples
use ironflow_engine::config::HumanInputConfig;
assert!(HumanInputConfig::new("Answer?").deadline_secs().is_none());Sourcepub fn on_timeout_policy(&self) -> Option<&EscalationPolicy>
pub fn on_timeout_policy(&self) -> Option<&EscalationPolicy>
The configured escalation policy, if any.
§Examples
use ironflow_engine::config::HumanInputConfig;
assert!(HumanInputConfig::new("Answer?").on_timeout_policy().is_none());Sourcepub fn assignee(&self) -> Option<&Assignee>
pub fn assignee(&self) -> Option<&Assignee>
The user or group the input is assigned to, if any.
§Examples
use ironflow_engine::config::HumanInputConfig;
assert!(HumanInputConfig::new("Answer?").assignee().is_none());Sourcepub fn approvers(&self) -> Option<&Approvers>
pub fn approvers(&self) -> Option<&Approvers>
The approvers allowed to answer, if any were set.
§Examples
use ironflow_engine::config::HumanInputConfig;
assert!(HumanInputConfig::new("Answer?").approvers().is_none());Sourcepub fn effective_deadline_secs(&self) -> Option<u64>
pub fn effective_deadline_secs(&self) -> Option<u64>
The deadline actually enforced, in seconds.
§Examples
use ironflow_engine::config::HumanInputConfig;
let config = HumanInputConfig::new("Answer?").with_deadline_secs(60);
assert_eq!(config.effective_deadline_secs(), Some(60));Sourcepub fn effective_policy(&self) -> EscalationPolicy
pub fn effective_policy(&self) -> EscalationPolicy
The policy applied when the deadline fires. Defaults to
EscalationPolicy::AutoReject.
§Examples
use ironflow_engine::config::{EscalationPolicy, HumanInputConfig};
let config = HumanInputConfig::new("Answer?").with_deadline_secs(60);
assert_eq!(config.effective_policy(), EscalationPolicy::AutoReject);