import Foundation import JSONUtilities public struct BuildScript: Equatable { public var script: ScriptType public var name: String? public var shell: String? public var inputFiles: [String] public var outputFiles: [String] public var inputFileLists: [String] public var outputFileLists: [String] public var runOnlyWhenInstalling: Bool public let showEnvVars: Bool public enum ScriptType: Equatable { case path(String) case script(String) } public init( script: ScriptType, name: String? = nil, inputFiles: [String] = [], outputFiles: [String] = [], inputFileLists: [String] = [], outputFileLists: [String] = [], shell: String? = nil, runOnlyWhenInstalling: Bool = false, showEnvVars: Bool = true ) { self.script = script self.name = name self.inputFiles = inputFiles self.outputFiles = outputFiles self.inputFileLists = inputFileLists self.outputFileLists = outputFileLists self.shell = shell self.runOnlyWhenInstalling = runOnlyWhenInstalling self.showEnvVars = showEnvVars } } extension BuildScript: JSONObjectConvertible { public init(jsonDictionary: JSONDictionary) throws { name = jsonDictionary.json(atKeyPath: "name") inputFiles = jsonDictionary.json(atKeyPath: "inputFiles") ?? [] outputFiles = jsonDictionary.json(atKeyPath: "outputFiles") ?? [] inputFileLists = jsonDictionary.json(atKeyPath: "inputFileLists") ?? [] outputFileLists = jsonDictionary.json(atKeyPath: "outputFileLists") ?? [] if let string: String = jsonDictionary.json(atKeyPath: "script") { script = .script(string) } else { let path: String = try jsonDictionary.json(atKeyPath: "path") script = .path(path) } shell = jsonDictionary.json(atKeyPath: "shell") runOnlyWhenInstalling = jsonDictionary.json(atKeyPath: "runOnlyWhenInstalling") ?? false showEnvVars = jsonDictionary.json(atKeyPath: "showEnvVars") ?? true } } extension BuildScript: JSONDictionaryEncodable { public func toJSONDictionary() -> JSONDictionary { var dict: JSONDictionary = [:] if runOnlyWhenInstalling { dict["runOnlyWhenInstalling"] = runOnlyWhenInstalling } if !showEnvVars { dict["showEnvVars"] = showEnvVars } if inputFiles.count > 0 { dict["inputFiles"] = inputFiles } if inputFileLists.count > 0 { dict["inputFileLists"] = inputFileLists } if outputFiles.count > 0 { dict["outputFiles"] = outputFiles } if outputFileLists.count > 0 { dict["outputFileLists"] = outputFileLists } if let name = name { dict["name"] = name } if let shell = shell { dict["shell"] = shell } switch script { case .path(let string): dict["path"] = string case .script(let string): dict["script"] = string } return dict } } extension BuildScript: PathContainer { static var pathProperties: [PathProperty] { return [ .string("path"), ] } }