forked from vapor/postgres-kit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPostgresRow+SQL.swift
40 lines (32 loc) · 1.16 KB
/
PostgresRow+SQL.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
extension PostgresRow {
public func sql(decoder: PostgresDataDecoder = .init()) -> SQLRow {
return _PostgresSQLRow(row: self.makeRandomAccess(), decoder: decoder)
}
}
// MARK: Private
private struct _PostgresSQLRow: SQLRow {
let randomAccessView: PostgresRandomAccessRow
let decoder: PostgresDataDecoder
enum _Error: Error {
case missingColumn(String)
}
init(row: PostgresRandomAccessRow, decoder: PostgresDataDecoder) {
self.randomAccessView = row
self.decoder = decoder
}
var allColumns: [String] {
self.randomAccessView.map { $0.columnName }
}
func contains(column: String) -> Bool {
self.randomAccessView.contains(column)
}
func decodeNil(column: String) throws -> Bool {
!self.randomAccessView.contains(column) || self.randomAccessView[column].bytes == nil
}
func decode<D>(column: String, as type: D.Type) throws -> D where D : Decodable {
guard self.randomAccessView.contains(column) else {
throw _Error.missingColumn(column)
}
return try self.decoder.decode(D.self, from: self.randomAccessView[data: column])
}
}