use serde::{Deserialize, Serialize};
use std::fmt;
use std::path::{Path, PathBuf};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum PolicyMode {
Fresh,
WarmStart,
Resume,
}
impl std::fmt::Display for PolicyMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PolicyMode::Fresh => f.write_str("fresh"),
PolicyMode::WarmStart => f.write_str("warm_start"),
PolicyMode::Resume => f.write_str("resume"),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct BoundaryPolicy {
pub path: String,
#[serde(default)]
pub source_stage: Option<u32>,
}
impl BoundaryPolicy {
#[must_use]
pub fn checkpoint_path(&self, case_dir: &Path) -> PathBuf {
case_dir.join(&self.path)
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default, deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct PolicyConfig {
pub path: String,
pub mode: PolicyMode,
pub checkpointing: CheckpointingConfig,
#[serde(default)]
pub boundary: Option<BoundaryPolicy>,
}
impl Default for PolicyConfig {
fn default() -> Self {
Self {
path: "./policy".to_string(),
mode: PolicyMode::Fresh,
checkpointing: CheckpointingConfig::default(),
boundary: None,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(default, deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct CheckpointingConfig {
#[serde(default)]
pub enabled: Option<bool>,
#[serde(default)]
pub initial_iteration: Option<u32>,
#[serde(default)]
pub interval_iterations: Option<u32>,
#[serde(default)]
pub store_basis: Option<bool>,
#[serde(default)]
pub compress: Option<bool>,
}