1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import Foundation
import SWBProtocol
public struct Pair<First, Second> {
public var first: First
public var second: Second
public init(_ first: First, _ second: Second) {
self.first = first
self.second = second
}
}
extension Pair: Equatable where First: Equatable, Second: Equatable {}
extension Pair: Hashable where First: Hashable, Second: Hashable {}
extension Pair: Sendable where First: Sendable, Second: Sendable {}
extension Pair: Comparable where First: Comparable, Second: Comparable {
public static func < (lhs: Self, rhs: Self) -> Bool {
(lhs.first, lhs.second) < (rhs.first, rhs.second)
}
}
extension ProjectModel {
public struct CustomTask: Hashable, Sendable {
public var commandLine: [String]
public var environment: [Pair<String, String>]
public var workingDirectory: String?
public var executionDescription: String
public var inputFilePaths: [String]
public var outputFilePaths: [String]
public var enableSandboxing: Bool
public var preparesForIndexing: Bool
public init(
commandLine: [String],
environment: [Pair<String, String>],
workingDirectory: String?,
executionDescription: String,
inputFilePaths: [String],
outputFilePaths: [String],
enableSandboxing: Bool,
preparesForIndexing: Bool
) {
self.commandLine = commandLine
self.environment = environment
self.workingDirectory = workingDirectory
self.executionDescription = executionDescription
self.inputFilePaths = inputFilePaths
self.outputFilePaths = outputFilePaths
self.enableSandboxing = enableSandboxing
self.preparesForIndexing = preparesForIndexing
}
}
}
extension ProjectModel.CustomTask: Codable {
public init(from decoder: any Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.commandLine = try container.decode([String].self, forKey: .commandLine)
let environment = try container.decode([[String]].self, forKey: .environment)
self.environment = environment.compactMap { strs in
guard let k = strs.first, let v = strs.dropFirst().first else {
return nil
}
return Pair(k, v)
}
self.workingDirectory = try container.decodeIfPresent(String.self, forKey: .workingDirectory)
self.executionDescription = try container.decode(String.self, forKey: .executionDescription)
self.inputFilePaths = try container.decode([String].self, forKey: .inputFilePaths)
self.outputFilePaths = try container.decode([String].self, forKey: .outputFilePaths)
self.enableSandboxing = try container.decode(String.self, forKey: .enableSandboxing) == "true"
self.preparesForIndexing = try container.decode(String.self, forKey: .preparesForIndexing) == "true"
}
public func encode(to encoder: any Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.commandLine, forKey: .commandLine)
try container.encode(self.environment.map { [$0.first, $0.second] }, forKey: .environment)
try container.encodeIfPresent(self.workingDirectory, forKey: .workingDirectory)
try container.encode(self.executionDescription, forKey: .executionDescription)
try container.encode(self.inputFilePaths, forKey: .inputFilePaths)
try container.encode(self.outputFilePaths, forKey: .outputFilePaths)
try container.encode(self.enableSandboxing ? "true" : "false", forKey: .enableSandboxing)
try container.encode(self.preparesForIndexing ? "true" : "false", forKey: .preparesForIndexing)
}
enum CodingKeys: String, CodingKey {
case commandLine
case environment
case workingDirectory
case executionDescription
case inputFilePaths
case outputFilePaths
case enableSandboxing
case preparesForIndexing
}
}
|