use std::time::Duration;
#[derive(Debug, Clone, Default)]
pub enum TimeoutPolicy {
#[default]
None,
Cancel(Duration),
Warn(Duration),
}
#[derive(Debug, Clone)]
pub struct OffloadConfig {
pub max_concurrent_tasks: Option<usize>,
pub timeout_policy: TimeoutPolicy,
pub deduplicate: bool,
}
impl Default for OffloadConfig {
fn default() -> Self {
Self {
max_concurrent_tasks: None,
timeout_policy: TimeoutPolicy::None,
deduplicate: true,
}
}
}
impl OffloadConfig {
pub fn builder() -> OffloadConfigBuilder {
OffloadConfigBuilder::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct OffloadConfigBuilder {
max_concurrent_tasks: Option<usize>,
timeout_policy: TimeoutPolicy,
deduplicate: bool,
}
impl OffloadConfigBuilder {
pub fn new() -> Self {
Self {
max_concurrent_tasks: None,
timeout_policy: TimeoutPolicy::None,
deduplicate: true,
}
}
pub fn max_concurrent_tasks(self, max: usize) -> Self {
Self {
max_concurrent_tasks: Some(max),
..self
}
}
pub fn timeout_policy(self, policy: TimeoutPolicy) -> Self {
Self {
timeout_policy: policy,
..self
}
}
pub fn timeout(self, duration: Duration) -> Self {
self.timeout_policy(TimeoutPolicy::Cancel(duration))
}
pub fn deduplicate(self, enabled: bool) -> Self {
Self {
deduplicate: enabled,
..self
}
}
pub fn build(self) -> OffloadConfig {
OffloadConfig {
max_concurrent_tasks: self.max_concurrent_tasks,
timeout_policy: self.timeout_policy,
deduplicate: self.deduplicate,
}
}
}