use crate::common::PhaseId;
use chrono::{NaiveDate, NaiveTime};
use chrono_tz::Tz;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct HyperclockConfig {
pub resolution: ClockResolution,
#[serde(default = "default_phases")]
pub phases: Vec<PhaseConfig>,
#[serde(default)]
pub gong_config: GongConfig,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ClockResolution {
Ultra,
High,
Medium,
Low,
Custom { ticks_per_second: u64 },
}
#[derive(Debug, Clone, Deserialize)]
pub struct PhaseConfig {
pub id: PhaseId,
pub label: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct GongConfig {
#[serde(default = "default_timezone")]
pub timezone: Tz,
#[serde(default)]
pub holidays: Vec<Holiday>,
#[serde(default)]
pub workday_milestones: Vec<NaiveTime>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Holiday {
pub name: String,
pub date: NaiveDate,
}
fn default_phases() -> Vec<PhaseConfig> {
vec![PhaseConfig {
id: PhaseId(0),
label: "default_phase".to_string(),
}]
}
fn default_timezone() -> Tz {
Tz::UTC
}
impl Default for GongConfig {
fn default() -> Self {
Self {
timezone: default_timezone(),
holidays: Vec::new(),
workday_milestones: Vec::new(),
}
}
}