use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::types::{
DeployStrategy, PlacementConstraint, Replicas, ResourceLimits, RuntimeKind, VolumeSpec,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProbeConfig {
pub path: String,
pub port: Option<u16>,
#[serde(default = "default_probe_interval")]
pub interval_secs: u64,
#[serde(default = "default_probe_timeout")]
pub timeout_secs: u64,
#[serde(default = "default_probe_failures")]
pub failure_threshold: u32,
#[serde(default = "default_initial_delay")]
pub initial_delay_secs: u64,
}
fn default_probe_interval() -> u64 {
10
}
fn default_probe_timeout() -> u64 {
3
}
fn default_probe_failures() -> u32 {
3
}
fn default_initial_delay() -> u64 {
5
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BuildConfig {
pub repo: String,
pub branch: Option<String>,
pub dockerfile: Option<String>,
pub context: Option<String>,
}
impl BuildConfig {
pub fn branch_or_default(&self) -> &str {
self.branch.as_deref().unwrap_or("main")
}
pub fn dockerfile_or_default(&self) -> &str {
self.dockerfile.as_deref().unwrap_or("Dockerfile")
}
pub fn context_or_default(&self) -> &str {
self.context.as_deref().unwrap_or(".")
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServicesConfig {
pub service: Vec<ServiceConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceConfig {
pub name: String,
#[serde(default)]
pub runtime: RuntimeKind,
pub image: Option<String>,
pub module: Option<String>,
#[serde(default)]
pub replicas: Replicas,
pub port: Option<u16>,
pub host_port: Option<u16>,
pub domain: Option<String>,
#[serde(default)]
pub routes: Vec<String>,
pub health: Option<String>,
pub readiness: Option<ProbeConfig>,
pub liveness: Option<ProbeConfig>,
#[serde(default)]
pub env: HashMap<String, String>,
pub resources: Option<ResourceLimits>,
pub volume: Option<VolumeSpec>,
pub deploy: Option<DeployStrategy>,
pub placement: Option<PlacementConstraint>,
pub network: Option<String>,
#[serde(default)]
pub aliases: Vec<String>,
#[serde(default)]
pub mounts: Vec<String>,
#[serde(default)]
pub triggers: Vec<String>,
pub assets: Option<String>,
pub build: Option<BuildConfig>,
pub tls_cert: Option<String>,
pub tls_key: Option<String>,
#[serde(default)]
pub internal: bool,
}