1use std::collections::HashMap;
7
8use rskit_errors::{AppError, AppResult};
9use serde::{Deserialize, Serialize};
10
11pub const DEFAULT_PROVIDER: &str = "docker";
17
18#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
20#[serde(default)]
21pub struct WorkloadConfig {
22 pub enabled: bool,
25 pub provider: String,
27 pub default_labels: HashMap<String, String>,
29}
30
31impl Default for WorkloadConfig {
32 fn default() -> Self {
33 Self {
34 enabled: false,
35 provider: DEFAULT_PROVIDER.to_owned(),
36 default_labels: HashMap::new(),
37 }
38 }
39}
40
41impl WorkloadConfig {
42 pub fn apply_defaults(&mut self) {
45 let trimmed = self.provider.trim();
46 if trimmed.is_empty() {
47 DEFAULT_PROVIDER.clone_into(&mut self.provider);
48 } else if trimmed.len() != self.provider.len() {
49 self.provider = trimmed.to_owned();
50 }
51 }
52
53 pub fn validate(&self) -> AppResult<()> {
59 if self.provider.trim().is_empty() {
60 return Err(AppError::missing_field("workload.provider"));
61 }
62 Ok(())
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69
70 #[test]
71 fn default_is_disabled_with_docker_provider() {
72 let cfg = WorkloadConfig::default();
73 assert!(!cfg.enabled);
74 assert_eq!(cfg.provider, "docker");
75 assert!(cfg.default_labels.is_empty());
76 }
77
78 #[test]
79 fn apply_defaults_fills_empty_provider() {
80 let mut cfg = WorkloadConfig {
81 provider: " ".to_string(),
82 ..Default::default()
83 };
84 cfg.apply_defaults();
85 assert_eq!(cfg.provider, "docker");
86 }
87
88 #[test]
89 fn apply_defaults_keeps_explicit_provider() {
90 let mut cfg = WorkloadConfig {
91 provider: "kubernetes".to_string(),
92 ..Default::default()
93 };
94 cfg.apply_defaults();
95 assert_eq!(cfg.provider, "kubernetes");
96 }
97
98 #[test]
99 fn apply_defaults_trims_surrounding_whitespace() {
100 let mut cfg = WorkloadConfig {
101 provider: " docker ".to_string(),
102 ..Default::default()
103 };
104 cfg.apply_defaults();
105 assert_eq!(cfg.provider, "docker");
106 }
107
108 #[test]
109 fn validate_rejects_empty_provider() {
110 let cfg = WorkloadConfig {
111 provider: String::new(),
112 ..Default::default()
113 };
114 let err = cfg.validate().unwrap_err();
115 assert_eq!(err.code(), rskit_errors::ErrorCode::MissingField);
116 }
117
118 #[test]
119 fn validate_accepts_named_provider() {
120 let cfg = WorkloadConfig {
121 provider: "docker".to_string(),
122 ..Default::default()
123 };
124 assert!(cfg.validate().is_ok());
125 }
126}