# Workspace Factory Configuration # Generates merged workspace config from defaults + mode + user overrides # # Usage (in user workspace config.ncl): # let factory = import "provisioning/templates/workspace/nickel/main.ncl" in # factory.generate { # workspace_name = "librecloud_hetzner", # deployment_mode = "solo", # provider = "hetzner", # } let lib = import "schemas/lib.ncl" in let helpers = import "./lib/helpers.ncl" in { # Factory function to generate workspace config generate | doc "Generate complete workspace config from composition of defaults, mode config, and user overrides" = fun config_overrides => ( let workspace_name = config_overrides.workspace_name or "unnamed_workspace" in let mode = config_overrides.deployment_mode or "solo" in let provider = config_overrides.provider or "generic" in # Load mode-specific defaults let mode_defaults = ( if mode == "solo" then import "schemas/deployment/modes/solo/defaults.ncl" else if mode == "multiuser" then import "schemas/deployment/modes/multiuser/defaults.ncl" else if mode == "cicd" then import "schemas/deployment/modes/cicd_enterprise/defaults.ncl" else import "schemas/deployment/modes/base/defaults.ncl" ) in # Load provider defaults let provider_defaults = ( if provider == "hetzner" then { provider = "hetzner", cloud_api_enabled = true, region = "eu-central", } else if provider == "upcloud" then { provider = "upcloud", cloud_api_enabled = true, region = "pl-waw", } else if provider == "oci" then { provider = "oci", cloud_api_enabled = true, region = "eu-zurich-1", } else { provider = provider, cloud_api_enabled = false, } ) in # Compose: base defaults → mode defaults → provider defaults → user overrides # Using helpers.compose_config for proper deep merge helpers.compose_config mode_defaults provider_defaults (config_overrides & {workspace_name = workspace_name}) ), # Composition helper for deep merging compose | doc "Deep merge records preserving nested structures" = fun base => fun mode_config => fun user_overrides => ( # Use helpers.compose_config (recursive deep merge) helpers.compose_config base mode_config user_overrides ), }