Skip to content

Commit fcb54e2

Browse files
authored
SWIFT-314 Use BSONDecoder to decode isMaster responses in SDAM monitoring (#403)
1 parent 9c2604a commit fcb54e2

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

Sources/MongoSwift/SDAM.swift

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
4262
public 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

Comments
 (0)