use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GovernorConfig {
pub versioning: VersioningConfig,
pub changelog: ChangelogConfig,
pub publish: PublishConfig,
pub git: GitConfig,
pub ci: CiConfig,
}
impl Default for GovernorConfig {
fn default() -> Self {
Self {
versioning: VersioningConfig::default(),
changelog: ChangelogConfig::default(),
publish: PublishConfig::default(),
git: GitConfig::default(),
ci: CiConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VersioningConfig {
pub scheme: VersionScheme,
pub shared_version: bool,
pub prerelease_prefix: Option<String>,
}
impl Default for VersioningConfig {
fn default() -> Self {
Self {
scheme: VersionScheme::Conventional,
shared_version: true,
prerelease_prefix: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum VersionScheme {
Conventional,
Manual,
CalVer,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChangelogConfig {
pub enabled: bool,
pub path: String,
pub format: ChangelogFormat,
pub incremental: bool,
}
impl Default for ChangelogConfig {
fn default() -> Self {
Self {
enabled: true,
path: "CHANGELOG.md".to_string(),
format: ChangelogFormat::KeepAChangelog,
incremental: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ChangelogFormat {
KeepAChangelog,
GitHubReleases,
Json,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PublishConfig {
pub auto_order: bool,
pub delay_secs: u64,
pub max_retries: usize,
pub error_handling: super::traits::workflow_step::ErrorHandlingStrategy,
}
impl Default for PublishConfig {
fn default() -> Self {
Self {
auto_order: true,
delay_secs: 10,
max_retries: 3,
error_handling: super::traits::workflow_step::ErrorHandlingStrategy::Stop,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GitConfig {
pub enabled: bool,
pub commit: bool,
pub tag: bool,
pub push: PushBehavior,
pub commit_template: Option<String>,
pub tag_template: Option<String>,
}
impl Default for GitConfig {
fn default() -> Self {
Self {
enabled: true,
commit: true,
tag: true,
push: PushBehavior::Auto,
commit_template: Some("chore(release): bump version to {version}".to_string()),
tag_template: Some("v{version}".to_string()),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PushBehavior {
Auto,
Always,
Never,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CiConfig {
pub auto_detect: bool,
pub confirm: bool,
pub format: OutputFormat,
}
impl Default for CiConfig {
fn default() -> Self {
Self {
auto_detect: true,
confirm: false,
format: OutputFormat::Json,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum OutputFormat {
Json,
Yaml,
Human,
}
pub fn load_config(path: &PathBuf) -> super::Result<GovernorConfig> {
let contents = std::fs::read_to_string(path).map_err(|e| super::Error::Io(e))?;
let config: GovernorConfig = toml::from_str(&contents)
.map_err(|e| super::Error::Serialization(e.to_string()))?;
Ok(config)
}