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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
//===----------------------------------------------------------------------===//
//
// 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
class SWBServiceConsoleCreateSessionCommand: SWBServiceConsoleCommand {
static let name = "createSession"
static func usage() -> String {
return name + " <name>"
}
static func validate(invocation: SWBServiceConsoleCommandInvocation) -> SWBServiceConsoleError? {
if invocation.commandLine.count != 2 {
return SWBServiceConsoleError.invalidCommandError(description: "usage: " + usage() + "\n")
}
return nil
}
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
let name = invocation.commandLine[1]
switch await Result.catching({ try await invocation.console.createSession(name) }) {
case .success(let session):
return .success(SWBServiceConsoleResult(output: "\(session.uid)\n"))
case .failure(let error):
return .failure(SWBServiceConsoleError(error))
}
}
}
class SWBServiceConsoleListSessionsCommand: SWBServiceConsoleCommand {
static let name = "listSessions"
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
switch await Result.catching({ try await invocation.console.service.listSessions() as ListSessionsResponse }) {
case .success(let sessions):
return .success(SWBServiceConsoleResult(output: sessions.sessions.sorted(byKey: <).map { uid, info in "\(uid): \(info.name) (\(info.activeBuildCount) active builds, \(info.activeNormalBuildCount) normal, \(info.activeIndexBuildCount) index)" }.joined(separator: "\n") + "\n"))
case .failure(let error):
return .failure(SWBServiceConsoleError(error))
}
}
}
class SWBServiceConsoleShowSessionCommand: SWBServiceConsoleCommand {
static let name = "showSession"
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
guard let session = invocation.console.activeSession else {
return .success(SWBServiceConsoleResult(output: "no active session\n"))
}
return .success(SWBServiceConsoleResult(output: "activeSession = '\(session.uid)'\n"))
}
}
class SWBServiceConsoleSelectSessionCommand: SWBServiceConsoleCommand {
static let name = "selectSession"
static func usage() -> String {
return name + " <uid>"
}
static func validate(invocation: SWBServiceConsoleCommandInvocation) -> SWBServiceConsoleError? {
if invocation.commandLine.count != 2 {
return SWBServiceConsoleError.invalidCommandError(description: "usage: " + usage() + "\n")
}
return nil
}
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
let uid = invocation.commandLine[1]
guard let session = invocation.console.sessions.values.filter({ $0.uid == uid }).first else {
return .failure(.failedCommandError(description: "error: no session for UID '\(uid)'\n"))
}
invocation.console.activeSession = session
return .success(SWBServiceConsoleResult(output: "ok\n"))
}
}
class SWBServiceConsoleDeleteSessionCommand: SWBServiceConsoleCommand {
static let name = "deleteSession"
static func usage() -> String {
return name + " <uid>"
}
static func validate(invocation: SWBServiceConsoleCommandInvocation) -> SWBServiceConsoleError? {
if invocation.commandLine.count != 2 {
return SWBServiceConsoleError.invalidCommandError(description: "usage: " + usage() + "\n")
}
return nil
}
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
let uid = invocation.commandLine[1]
switch await Result.catching({ try await invocation.console.deleteSession(uid) }) {
case .success:
return .success(SWBServiceConsoleResult(output: "ok\n"))
case .failure(let error):
return .failure(SWBServiceConsoleError(error))
}
}
}
func registerSessionCommands() {
for commandClass in ([
SWBServiceConsoleCreateSessionCommand.self,
SWBServiceConsoleListSessionsCommand.self,
SWBServiceConsoleShowSessionCommand.self,
SWBServiceConsoleSelectSessionCommand.self,
SWBServiceConsoleDeleteSessionCommand.self,
] as [any SWBServiceConsoleCommand.Type]) {
SWBServiceConsoleCommandRegistry.registerCommandClass(commandClass)
}
}
|