@@ -33,7 +33,10 @@ struct ToolchainSetInfo: OutputData {
3333 let versionFile : String ?
3434
3535 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) ` "
3740 if let previousVersion = previousVersion {
3841 message += " (was \( previousVersion. name) ) "
3942 }
@@ -55,3 +58,120 @@ enum ToolchainSource: Codable, CustomStringConvertible {
5558 }
5659 }
5760}
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