@@ -33,7 +33,10 @@ struct ToolchainSetInfo: OutputData {
33
33
let versionFile : String ?
34
34
35
35
var description : String {
36
- var message = self . isGlobal ? " The global default toolchain has been set to ` \( self . version) ` " : " The file ` \( self . versionFile ?? " .swift-version " ) ` has been set to ` \( self . version) ` "
36
+ var message =
37
+ self . isGlobal
38
+ ? " The global default toolchain has been set to ` \( self . version) ` "
39
+ : " The file ` \( self . versionFile ?? " .swift-version " ) ` has been set to ` \( self . version) ` "
37
40
if let previousVersion = previousVersion {
38
41
message += " (was \( previousVersion. name) ) "
39
42
}
@@ -55,3 +58,120 @@ enum ToolchainSource: Codable, CustomStringConvertible {
55
58
}
56
59
}
57
60
}
61
+
62
+ struct AvailableToolchainInfo : OutputData {
63
+ let version : ToolchainVersion
64
+ let inUse : Bool
65
+ let isDefault : Bool
66
+ let installed : Bool
67
+
68
+ var description : String {
69
+ var message = " \( version) "
70
+ if self . installed {
71
+ message += " (installed) "
72
+ }
73
+ if self . inUse {
74
+ message += " (in use) "
75
+ }
76
+ if self . isDefault {
77
+ message += " (default) "
78
+ }
79
+ return message
80
+ }
81
+
82
+ private enum CodingKeys : String , CodingKey {
83
+ case version
84
+ case inUse
85
+ case `default`
86
+ case installed
87
+ }
88
+
89
+ private enum ToolchainVersionCodingKeys : String , CodingKey {
90
+ case name
91
+ case type
92
+ case branch
93
+ case major
94
+ case minor
95
+ case patch
96
+ case date
97
+ }
98
+
99
+ public func encode( to encoder: Encoder ) throws {
100
+ var container = encoder. container ( keyedBy: CodingKeys . self)
101
+ try container. encode ( self . inUse, forKey: . inUse)
102
+ try container. encode ( self . isDefault, forKey: . default)
103
+ try container. encode ( self . installed, forKey: . installed)
104
+
105
+ // Encode the version as a object
106
+ var versionContainer = container. nestedContainer (
107
+ keyedBy: ToolchainVersionCodingKeys . self, forKey: . version
108
+ )
109
+ try versionContainer. encode ( self . version. name, forKey: . name)
110
+
111
+ switch self . version {
112
+ case let . stable( release) :
113
+ try versionContainer. encode ( " stable " , forKey: . type)
114
+ try versionContainer. encode ( release. major, forKey: . major)
115
+ try versionContainer. encode ( release. minor, forKey: . minor)
116
+ try versionContainer. encode ( release. patch, forKey: . patch)
117
+ case let . snapshot( snapshot) :
118
+ try versionContainer. encode ( " snapshot " , forKey: . type)
119
+ try versionContainer. encode ( snapshot. date, forKey: . date)
120
+ try versionContainer. encode ( snapshot. branch. name, forKey: . branch)
121
+
122
+ if let major = snapshot. branch. major,
123
+ let minor = snapshot. branch. minor
124
+ {
125
+ try versionContainer. encode ( major, forKey: . major)
126
+ try versionContainer. encode ( minor, forKey: . minor)
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ struct AvailableToolchainsListInfo : OutputData {
133
+ let toolchains : [ AvailableToolchainInfo ]
134
+ let selector : ToolchainSelector ?
135
+
136
+ init ( toolchains: [ AvailableToolchainInfo ] , selector: ToolchainSelector ? = nil ) {
137
+ self . toolchains = toolchains
138
+ self . selector = selector
139
+ }
140
+
141
+ private enum CodingKeys : String , CodingKey {
142
+ case toolchains
143
+ }
144
+
145
+ var description : String {
146
+ var lines : [ String ] = [ ]
147
+
148
+ if let selector = selector {
149
+ let modifier =
150
+ switch selector
151
+ {
152
+ case let . stable( major, minor, nil ) :
153
+ if let minor {
154
+ " Swift \( major) . \( minor) release "
155
+ } else {
156
+ " Swift \( major) release "
157
+ }
158
+ case . snapshot( . main, nil ) :
159
+ " main development snapshot "
160
+ case let . snapshot( . release( major, minor) , nil ) :
161
+ " \( major) . \( minor) development snapshot "
162
+ default :
163
+ " matching "
164
+ }
165
+
166
+ let header = " Available \( modifier) toolchains "
167
+ lines. append ( header)
168
+ lines. append ( String ( repeating: " - " , count: header. count) )
169
+ } else {
170
+ lines. append ( " Available release toolchains " )
171
+ lines. append ( " ---------------------------- " )
172
+ }
173
+
174
+ lines. append ( contentsOf: self . toolchains. map ( \. description) )
175
+ return lines. joined ( separator: " \n " )
176
+ }
177
+ }
0 commit comments