|
1 | 1 | import ArgumentParser
|
| 2 | +import Foundation |
2 | 3 | import SwiftlyCore
|
3 | 4 |
|
4 | 5 | struct ListAvailable: SwiftlyCommand {
|
@@ -35,12 +36,11 @@ struct ListAvailable: SwiftlyCommand {
|
35 | 36 | ))
|
36 | 37 | var toolchainSelector: String?
|
37 | 38 |
|
38 |
| - private enum CodingKeys: String, CodingKey { |
39 |
| - case toolchainSelector |
40 |
| - } |
| 39 | + @Option(name: .long, help: "Output format (text, json)") |
| 40 | + var format: SwiftlyCore.OutputFormat = .text |
41 | 41 |
|
42 | 42 | mutating func run() async throws {
|
43 |
| - try await self.run(Swiftly.createDefaultContext()) |
| 43 | + try await self.run(Swiftly.createDefaultContext(format: self.format)) |
44 | 44 | }
|
45 | 45 |
|
46 | 46 | mutating func run(_ ctx: SwiftlyCoreContext) async throws {
|
@@ -76,48 +76,17 @@ struct ListAvailable: SwiftlyCommand {
|
76 | 76 | let installedToolchains = Set(config.listInstalledToolchains(selector: selector))
|
77 | 77 | let (inUse, _) = try await selectToolchain(ctx, config: &config)
|
78 | 78 |
|
79 |
| - let printToolchain = { (toolchain: ToolchainVersion) in |
80 |
| - var message = "\(toolchain)" |
81 |
| - if installedToolchains.contains(toolchain) { |
82 |
| - message += " (installed)" |
83 |
| - } |
84 |
| - if let inUse, toolchain == inUse { |
85 |
| - message += " (in use)" |
86 |
| - } |
87 |
| - if toolchain == config.inUse { |
88 |
| - message += " (default)" |
89 |
| - } |
90 |
| - await ctx.message(message) |
| 79 | + let availableToolchainInfos = toolchains.compactMap { toolchain -> AvailableToolchainInfo? in |
| 80 | + AvailableToolchainInfo( |
| 81 | + version: toolchain, |
| 82 | + inUse: inUse == toolchain, |
| 83 | + default: toolchain == config.inUse, |
| 84 | + installed: installedToolchains.contains(toolchain) |
| 85 | + ) |
91 | 86 | }
|
92 | 87 |
|
93 |
| - if let selector { |
94 |
| - let modifier = switch selector { |
95 |
| - case let .stable(major, minor, nil): |
96 |
| - if let minor { |
97 |
| - "Swift \(major).\(minor) release" |
98 |
| - } else { |
99 |
| - "Swift \(major) release" |
100 |
| - } |
101 |
| - case .snapshot(.main, nil): |
102 |
| - "main development snapshot" |
103 |
| - case let .snapshot(.release(major, minor), nil): |
104 |
| - "\(major).\(minor) development snapshot" |
105 |
| - default: |
106 |
| - "matching" |
107 |
| - } |
108 |
| - |
109 |
| - let message = "Available \(modifier) toolchains" |
110 |
| - await ctx.message(message) |
111 |
| - await ctx.message(String(repeating: "-", count: message.count)) |
112 |
| - for toolchain in toolchains { |
113 |
| - await printToolchain(toolchain) |
114 |
| - } |
115 |
| - } else { |
116 |
| - await ctx.message("Available release toolchains") |
117 |
| - await ctx.message("----------------------------") |
118 |
| - for toolchain in toolchains where toolchain.isStableRelease() { |
119 |
| - await printToolchain(toolchain) |
120 |
| - } |
121 |
| - } |
| 88 | + let filteredToolchains = selector != nil ? availableToolchainInfos : availableToolchainInfos.filter { $0.version.isStableRelease() } |
| 89 | + let listInfo = AvailableToolchainsListInfo(toolchains: filteredToolchains, selector: selector) |
| 90 | + try await ctx.output(listInfo) |
122 | 91 | }
|
123 | 92 | }
|
0 commit comments