use serde::{Deserialize, Serialize};
use sublime_standard_tools::config::{ConfigResult, Configurable};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct ChangesetConfig {
pub path: String,
pub history_path: String,
pub available_environments: Vec<String>,
pub default_environments: Vec<String>,
}
impl Default for ChangesetConfig {
fn default() -> Self {
Self {
path: ".changesets".to_string(),
history_path: ".changesets/history".to_string(),
available_environments: vec!["production".to_string()],
default_environments: vec!["production".to_string()],
}
}
}
impl Configurable for ChangesetConfig {
fn validate(&self) -> ConfigResult<()> {
if self.path.is_empty() {
return Err(sublime_standard_tools::config::ConfigError::ValidationError {
message: "changeset.path: Path cannot be empty".to_string(),
});
}
if self.history_path.is_empty() {
return Err(sublime_standard_tools::config::ConfigError::ValidationError {
message: "changeset.history_path: History path cannot be empty".to_string(),
});
}
if self.available_environments.is_empty() {
return Err(sublime_standard_tools::config::ConfigError::ValidationError {
message:
"changeset.available_environments: At least one environment must be available"
.to_string(),
});
}
for env in &self.default_environments {
if !self.available_environments.contains(env) {
return Err(sublime_standard_tools::config::ConfigError::ValidationError {
message: format!(
"changeset.default_environments: Default environment '{}' is not in available environments",
env
),
});
}
}
Ok(())
}
fn merge_with(&mut self, other: Self) -> ConfigResult<()> {
self.path = other.path;
self.history_path = other.history_path;
self.available_environments = other.available_environments;
self.default_environments = other.default_environments;
Ok(())
}
}