use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GuardConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pending_capture: Option<crate::frontmatter::PendingCaptureGuardMode>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pending_done: Option<crate::frontmatter::PendingCaptureGuardMode>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub review_done: Option<crate::frontmatter::PendingCaptureGuardMode>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_done: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct LintConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dialect: Option<crate::frontmatter::LintDialectMode>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SshProfileConfig {
#[serde(default)]
pub targets: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SshDocConfig {
#[serde(default)]
pub profile: Option<String>,
#[serde(default)]
pub targets: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SshConfig {
#[serde(default)]
pub profiles: BTreeMap<String, SshProfileConfig>,
#[serde(default)]
pub docs: BTreeMap<String, SshDocConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ComponentConfig {
#[serde(default = "default_patch_mode", alias = "mode")]
pub patch: String,
#[serde(default = "default_merge_strategy")]
#[allow(dead_code)]
pub merge_strategy: String,
#[serde(default)]
pub timestamp: bool,
#[serde(default)]
pub max_entries: usize,
#[serde(default)]
#[allow(dead_code)]
pub max_lines: usize,
#[serde(default)]
pub pre_patch: Option<String>,
#[serde(default)]
pub post_patch: Option<String>,
}
fn default_patch_mode() -> String {
"replace".to_string()
}
fn default_merge_strategy() -> String {
"append-friendly".to_string()
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ProjectConfig {
#[serde(default)]
pub tmux_session: Option<String>,
#[serde(default, alias = "auto_compact")]
pub agent_doc_auto_compact: Option<usize>,
#[serde(default)]
pub guards: GuardConfig,
#[serde(default)]
pub lint: LintConfig,
#[serde(default)]
pub ssh: SshConfig,
#[serde(default)]
pub components: BTreeMap<String, ComponentConfig>,
}
pub fn parse_project_toml(content: &str) -> Result<ProjectConfig> {
toml::from_str(content).map_err(anyhow::Error::from)
}
pub fn parse_legacy_components_toml(
content: &str,
) -> Result<BTreeMap<String, ComponentConfig>> {
toml::from_str(content).map_err(anyhow::Error::from)
}