validateConfig runs config and cross-validation checks, merging results into validationResult.
(v *validator.Validator, validationResult *validator.ValidationResult, tasks []*model.Task)
| 195 | |
| 196 | // validateConfig runs config and cross-validation checks, merging results into validationResult. |
| 197 | func validateConfig(v *validator.Validator, validationResult *validator.ValidationResult, tasks []*model.Task) { |
| 198 | configData := loadConfigForValidation() |
| 199 | mergeValidationResults(validationResult, v.ValidateConfig(configData)) |
| 200 | |
| 201 | if configData != nil && len(configData.Scopes) > 0 { |
| 202 | knownScopes := make(map[string]bool, len(configData.Scopes)) |
| 203 | for name := range configData.Scopes { |
| 204 | knownScopes[name] = true |
| 205 | } |
| 206 | mergeValidationResults(validationResult, v.ValidateTouchesAgainstScopes(tasks, knownScopes)) |
| 207 | } |
| 208 | |
| 209 | if configData != nil && len(configData.Phases) > 0 { |
| 210 | knownPhases := make(map[string]bool, len(configData.Phases)) |
| 211 | for _, m := range configData.Phases { |
| 212 | key := m.ID |
| 213 | if key == "" { |
| 214 | key = m.Name // backwards compat: fall back to name if no id |
| 215 | } |
| 216 | if key != "" { |
| 217 | knownPhases[key] = true |
| 218 | } |
| 219 | } |
| 220 | mergeValidationResults(validationResult, v.ValidatePhasesAgainstConfig(tasks, knownPhases)) |
| 221 | } |
| 222 | } |
| 223 | |
| 224 | // loadConfigForValidation extracts config data from viper for validation. |
| 225 | // Returns nil if no config file was loaded. |