use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::dto::DtoConfig;
use super::extras::Language;
use super::output::{
BuildCommandConfig, CleanConfig, LintConfig, OutputTemplate, SetupConfig, SyncConfig, TestConfig, UpdateConfig,
};
use super::tools::ToolsConfig;
use super::{FormatConfig, GenerateConfig};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WorkspaceConfig {
#[serde(default)]
pub alef_version: Option<String>,
#[serde(default)]
pub languages: Vec<Language>,
#[serde(default)]
pub tools: ToolsConfig,
#[serde(default)]
pub dto: DtoConfig,
#[serde(default)]
pub format: FormatConfig,
#[serde(default)]
pub format_overrides: HashMap<String, FormatConfig>,
#[serde(default)]
pub generate: GenerateConfig,
#[serde(default)]
pub generate_overrides: HashMap<String, GenerateConfig>,
#[serde(default)]
pub output_template: OutputTemplate,
#[serde(default)]
pub lint: HashMap<String, LintConfig>,
#[serde(default)]
pub test: HashMap<String, TestConfig>,
#[serde(default)]
pub setup: HashMap<String, SetupConfig>,
#[serde(default)]
pub update: HashMap<String, UpdateConfig>,
#[serde(default)]
pub clean: HashMap<String, CleanConfig>,
#[serde(default)]
pub build_commands: HashMap<String, BuildCommandConfig>,
#[serde(default)]
pub opaque_types: HashMap<String, String>,
#[serde(default)]
pub sync: Option<SyncConfig>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn workspace_config_deserializes_empty() {
let cfg: WorkspaceConfig = toml::from_str("").unwrap();
assert!(cfg.alef_version.is_none());
assert!(cfg.languages.is_empty());
assert!(cfg.lint.is_empty());
assert!(cfg.opaque_types.is_empty());
assert!(cfg.sync.is_none());
}
#[test]
fn workspace_config_deserializes_full() {
let toml_str = r#"
alef_version = "0.13.0"
languages = ["python", "node"]
[output_template]
python = "packages/python/{crate}/"
node = "packages/node/{crate}/"
[lint.python]
precondition = "command -v ruff >/dev/null 2>&1"
check = "ruff check ."
[test.python]
command = "uv run pytest"
[opaque_types]
Tree = "tree_sitter::Tree"
"#;
let cfg: WorkspaceConfig = toml::from_str(toml_str).unwrap();
assert_eq!(cfg.alef_version.as_deref(), Some("0.13.0"));
assert_eq!(cfg.languages.len(), 2);
assert_eq!(cfg.output_template.python.as_deref(), Some("packages/python/{crate}/"));
assert!(cfg.lint.contains_key("python"));
assert!(cfg.test.contains_key("python"));
assert_eq!(
cfg.opaque_types.get("Tree").map(String::as_str),
Some("tree_sitter::Tree")
);
}
}