@@ -38,6 +38,26 @@ public struct Address: Equatable {
3838 }
3939}
4040
41+ private struct IsMasterResponse : Decodable {
42+ fileprivate struct LastWrite : Decodable {
43+ public let lastWriteDate : Date ?
44+ }
45+
46+ fileprivate let lastWrite : LastWrite ?
47+ fileprivate let minWireVersion : Int ?
48+ fileprivate let maxWireVersion : Int ?
49+ fileprivate let me : String ?
50+ fileprivate let setName : String ?
51+ fileprivate let setVersion : Int ?
52+ fileprivate let electionId : ObjectId ?
53+ fileprivate let primary : String ?
54+ fileprivate let logicalSessionTimeoutMinutes : Int ?
55+ fileprivate let hosts : [ String ] ?
56+ fileprivate let passives : [ String ] ?
57+ fileprivate let arbiters : [ String ] ?
58+ fileprivate let tags : [ String : String ] ?
59+ }
60+
4161/// A struct describing a mongod or mongos process.
4262public struct ServerDescription {
4363 /// The possible types for a server.
@@ -126,37 +146,29 @@ public struct ServerDescription {
126146
127147 // initialize the rest of the values from the isMaster response.
128148 // we have to copy because libmongoc owns the pointer.
129- let isMaster = Document ( copying: mongoc_server_description_ismaster ( description) )
130-
131- self . lastWriteDate = isMaster [ " lasWrite " ] ? . documentValue ? [ " lastWriteDate " ] ? . dateValue
132- self . minWireVersion = isMaster [ " minWireVersion " ] ? . asInt ( ) ?? 0
133- self . maxWireVersion = isMaster [ " maxWireVersion " ] ? . asInt ( ) ?? 0
134- self . me = try ? isMaster [ " me " ] ? . stringValue. map ( Address . init)
135- self . setName = isMaster [ " setName " ] ? . stringValue
136- self . setVersion = isMaster [ " setVersion " ] ? . asInt ( )
137- self . electionId = isMaster [ " electionId " ] ? . objectIdValue
138- self . primary = try ? isMaster [ " primary " ] ? . stringValue. map ( Address . init)
139- self . logicalSessionTimeoutMinutes = isMaster [ " logicalSessionTimeoutMinutes " ] ? . asInt ( )
140-
141- self . hosts = isMaster [ " hosts " ] ? . arrayValue? . asArrayOf ( String . self) ? . compactMap { host in
142- try ? Address ( host)
149+ let isMasterDoc = Document ( copying: mongoc_server_description_ismaster ( description) )
150+ // TODO: SWIFT-349 log errors encountered here
151+ let isMaster = try ? BSONDecoder ( ) . decode ( IsMasterResponse . self, from: isMasterDoc)
152+
153+ self . lastWriteDate = isMaster? . lastWrite? . lastWriteDate
154+ self . minWireVersion = isMaster? . minWireVersion ?? 0
155+ self . maxWireVersion = isMaster? . maxWireVersion ?? 0
156+ self . me = try ? isMaster? . me. map ( Address . init) // TODO: SWIFT-349 log error
157+ self . setName = isMaster? . setName
158+ self . setVersion = isMaster? . setVersion
159+ self . electionId = isMaster? . electionId
160+ self . primary = try ? isMaster? . primary. map ( Address . init) // TODO: SWIFT-349 log error
161+ self . logicalSessionTimeoutMinutes = isMaster? . logicalSessionTimeoutMinutes
162+ self . hosts = isMaster? . hosts? . compactMap { host in
163+ try ? Address ( host) // TODO: SWIFT-349 log error
143164 } ?? [ ]
144-
145- self . passives = isMaster [ " passives " ] ? . arrayValue? . asArrayOf ( String . self) ? . compactMap { passive in
146- try ? Address ( passive)
165+ self . passives = isMaster? . passives? . compactMap { passive in
166+ try ? Address ( passive) // TODO: SWIFT-349 log error
147167 } ?? [ ]
148-
149- self . arbiters = isMaster [ " arbiters " ] ? . arrayValue? . asArrayOf ( String . self) ? . compactMap { arbiter in
150- try ? Address ( arbiter)
168+ self . arbiters = isMaster? . arbiters? . compactMap { arbiter in
169+ try ? Address ( arbiter) // TODO: SWIFT-349 log error
151170 } ?? [ ]
152-
153- self . tags = isMaster [ " tags " ] ? . documentValue. map { tagsDoc in
154- var tags : [ String : String ] = [ : ]
155- for (k, v) in tagsDoc {
156- tags [ k] = v. stringValue
157- }
158- return tags
159- } ?? [ : ]
171+ self . tags = isMaster? . tags ?? [ : ]
160172 }
161173}
162174
0 commit comments