use std::time::Duration;
use getset::{Getters, WithSetters};
use serde::{Deserialize, Serialize};
use strum::Display;
use typed_builder::TypedBuilder;
const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(5);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum StopSignal {
Terminate,
Interrupt,
}
#[derive(
Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Getters, WithSetters, TypedBuilder,
)]
#[set_with]
pub struct StopPolicy {
#[getset(get = "pub", set_with = "pub")]
signal: StopSignal,
#[serde(with = "humantime_serde")]
#[getset(get = "pub", set_with = "pub")]
grace_period: Duration,
}
impl Default for StopPolicy {
fn default() -> Self {
Self::builder()
.signal(StopSignal::Terminate)
.grace_period(DEFAULT_GRACE_PERIOD)
.build()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_a_human_readable_grace_period() {
let policy: StopPolicy =
serde_yaml_ng::from_str("signal: terminate\ngrace_period: 5s\n").unwrap();
assert_eq!(*policy.signal(), StopSignal::Terminate);
assert_eq!(*policy.grace_period(), Duration::from_secs(5));
}
#[test]
fn defaults_to_terminate_with_a_bounded_grace_period() {
let policy = StopPolicy::default();
assert_eq!(*policy.signal(), StopSignal::Terminate);
assert_eq!(*policy.grace_period(), DEFAULT_GRACE_PERIOD);
}
}