|
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