         case invalidTargetDependency(target: String, dependency: String)
         case invalidSchemeTarget(scheme: String, target: String)
         case invalidSchemeConfig(scheme: String, config: String)
+        case invalidConfigFile(configFile: String, config: String)
         case invalidTargetConfigFile(configFile: String, config: String, target: String)
         case invalidBuildSettingConfig(String)
         case invalidSettingsPreset(String)

        case invalidBuildScriptPath(target: String, path: String)
        case invalidTargetSchemeConfigVariant(target: String, configVariant: String, configType: ConfigType)
        case invalidTargetSchemeTest(target: String, testTarget: String)

        public var description: String {
            switch self {
            case let .invalidTargetDependency(target, dependency): return "Target \(target.quoted) has invalid dependency: \(dependency.quoted)"
            case let .invalidTargetConfigFile(configFile, config, target): return "Target \(target.quoted) has invalid config file \(configFile.quoted) for config \(config.quoted)"
            case let .invalidSchemeTarget(scheme, target): return "Scheme \(scheme.quoted) has invalid build target \(target.quoted)"
            case let .invalidSchemeConfig(scheme, config): return "Scheme \(scheme.quoted) has invalid build configuration \(config.quoted)"
            case let .invalidBuildSettingConfig(config): return "Build setting has invalid build configuration \(config.quoted)"

                }
            }
            return errors
        }

        for fileGroup in fileGroups {
            if !(path + fileGroup).exists {
                errors.append(.invalidFileGroup(fileGroup))
            }
        }

        for (config, configFile) in configFiles {
            if !(path + configFile).exists {
                errors.append(.invalidConfigFile(configFile: configFile, config: config))
            }
        }

        for settings in settingGroups.values {
