import Foundation import JSONUtilities import XcodeProj extension XCScheme.EnvironmentVariable: JSONObjectConvertible { public static let enabledDefault = true private static func parseValue(_ value: Any) -> String { if let bool = value as? Bool { return bool ? "YES" : "NO" } else { return String(describing: value) } } public init(jsonDictionary: JSONDictionary) throws { let value: String if let jsonValue = jsonDictionary["value"] { value = XCScheme.EnvironmentVariable.parseValue(jsonValue) } else { // will throw error value = try jsonDictionary.json(atKeyPath: "value") } let variable: String = try jsonDictionary.json(atKeyPath: "variable") let enabled: Bool = jsonDictionary.json(atKeyPath: "isEnabled") ?? XCScheme.EnvironmentVariable.enabledDefault self.init(variable: variable, value: value, enabled: enabled) } static func parseAll(jsonDictionary: JSONDictionary) throws -> [XCScheme.EnvironmentVariable] { if let variablesDictionary: [String: Any] = jsonDictionary.json(atKeyPath: "environmentVariables") { return variablesDictionary.mapValues(parseValue) .map { XCScheme.EnvironmentVariable(variable: $0.key, value: $0.value, enabled: true) } .sorted { $0.variable < $1.variable } } else if let variablesArray: [JSONDictionary] = jsonDictionary.json(atKeyPath: "environmentVariables") { return try variablesArray.map(XCScheme.EnvironmentVariable.init) } else { return [] } } } extension XCScheme.EnvironmentVariable: JSONEncodable { public func toJSONValue() -> Any { var dict: [String: Any] = [ "variable": variable, "value": value, ] if enabled != XCScheme.EnvironmentVariable.enabledDefault { dict["isEnabled"] = enabled } return dict } }