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
|
//===----------------------------------------------------------------------===//
//
// 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 SWBProtocol
import SWBUtil
import Foundation
fileprivate extension ExternalToolResult {
init(_ result: SWBExternalToolResult) {
switch result {
case .deferred:
self = .deferred
case let .result(status, stdout, stderr):
self = .result(status: .init(status), stdout: stdout, stderr: stderr)
}
}
}
fileprivate extension Processes.ExitStatus {
init(_ exitStatus: SWBProcessExitStatus) {
switch exitStatus {
case let .exit(code):
self = .exit(code)
case let .uncaughtSignal(signal):
self = .uncaughtSignal(signal)
}
}
}
@discardableResult func handle(message: ExternalToolExecutionRequest, session: SWBBuildServiceSession, delegate: (any SWBPlanningOperationDelegate)?) async -> any Message {
guard let delegate else {
return await session.service.send(ErrorResponse("No delegate for response."))
}
let result = await Result.catching { try await delegate.executeExternalTool(commandLine: message.commandLine, workingDirectory: message.workingDirectory?.str, environment: message.environment) }
let reply = ExternalToolExecutionResponse(sessionHandle: message.sessionHandle, exchangeHandle: message.exchangeHandle, value: result.map(ExternalToolResult.init).mapError { .error("\($0)") })
return await session.service.send(reply)
}
|