import Foundation import JSONUtilities public struct Config: Hashable { public var name: String public var type: ConfigType? public init(name: String, type: ConfigType? = nil) { self.name = name self.type = type } public static var defaultConfigs: [Config] = [Config(name: ConfigType.debug.name, type: .debug), Config(name: ConfigType.release.name, type: .release)] } public enum ConfigType: String, Hashable { case debug case release public var name: String { rawValue.prefix(1).uppercased() + rawValue.dropFirst() } } extension Config { public func matchesVariant(_ variant: String, for type: ConfigType) -> Bool { guard self.type == type else { return false } let nameWithoutType = self.name.lowercased() .replacingOccurrences(of: type.name.lowercased(), with: "") .trimmingCharacters(in: CharacterSet(charactersIn: " -_()")) return nameWithoutType == variant.lowercased() } } public extension Collection where Element == Config { func first(including configVariant: String, for type: ConfigType) -> Config? { first { $0.matchesVariant(configVariant, for: type) } } }