11import Foundation
22
33/// Representable by a `T[]` column on the PostgreSQL database.
4- public protocol PostgreSQLArrayCustomConvertible : PostgreSQLDataCustomConvertible , Codable {
4+ public protocol PostgreSQLArrayCustomConvertible : PostgreSQLDataCustomConvertible {
55 /// The associated array element type
6- associatedtype PostgreSQLArrayElement : PostgreSQLDataCustomConvertible
6+ associatedtype PostgreSQLArrayElement // : PostgreSQLDataCustomConvertible
77
88 /// Convert an array of elements to self.
99 static func convertFromPostgreSQLArray( _ data: [ PostgreSQLArrayElement ] ) -> Self
@@ -13,11 +13,6 @@ public protocol PostgreSQLArrayCustomConvertible: PostgreSQLDataCustomConvertibl
1313}
1414
1515extension PostgreSQLArrayCustomConvertible {
16- /// See `PostgreSQLDataCustomConvertible.postgreSQLDataType`
17- public static var postgreSQLDataType : PostgreSQLDataType {
18- return PostgreSQLArrayElement . postgreSQLDataArrayType
19- }
20-
2116 /// See `PostgreSQLDataCustomConvertible.convertFromPostgreSQLData(_:)`
2217 public static func convertFromPostgreSQLData( _ data: PostgreSQLData ) throws -> Self {
2318 guard var value = data. data else {
@@ -35,8 +30,8 @@ extension PostgreSQLArrayCustomConvertible {
3530 let count = Int ( value. extract ( Int32 . self) . bigEndian)
3631 let subValue = value. extract ( count: count)
3732 let psqlData = PostgreSQLData ( type: metadata. type, format: data. format, data: subValue)
38- let element = try PostgreSQLArrayElement . convertFromPostgreSQLData ( psqlData)
39- array. append ( element)
33+ let element = try requirePostgreSQLDataCustomConvertible ( PostgreSQLArrayElement . self ) . convertFromPostgreSQLData ( psqlData)
34+ array. append ( element as! PostgreSQLArrayElement )
4035 }
4136 } else {
4237 array = [ ]
@@ -48,13 +43,13 @@ extension PostgreSQLArrayCustomConvertible {
4843 /// See `PostgreSQLDataCustomConvertible.convertToPostgreSQLData()`
4944 public func convertToPostgreSQLData( ) throws -> PostgreSQLData {
5045 let elements = try convertToPostgreSQLArray ( ) . map {
51- try $0 . convertToPostgreSQLData ( )
46+ try requirePostgreSQLDataCustomConvertible ( $0 ) . convertToPostgreSQLData ( )
5247 }
5348
5449 var data = Data ( )
5550 data += Int32 ( 1 ) . data // non-null
5651 data += Int32 ( 0 ) . data // b
57- data += PostgreSQLArrayElement . postgreSQLDataType. raw. data // type
52+ data += requirePostgreSQLDataCustomConvertible ( PostgreSQLArrayElement . self ) . postgreSQLDataType. raw. data // type
5853 data += Int32 ( elements. count) . data // length
5954 data += Int32 ( 1 ) . data // dimensions
6055
@@ -67,7 +62,7 @@ extension PostgreSQLArrayCustomConvertible {
6762 }
6863 }
6964
70- return PostgreSQLData ( type: PostgreSQLArrayElement . postgreSQLDataArrayType, format: . binary, data: data)
65+ return PostgreSQLData ( type: requirePostgreSQLDataCustomConvertible ( PostgreSQLArrayElement . self ) . postgreSQLDataArrayType, format: . binary, data: data)
7166 }
7267}
7368
@@ -107,10 +102,15 @@ extension PostgreSQLArrayMetadata: CustomStringConvertible {
107102 }
108103}
109104
110- extension Array : PostgreSQLArrayCustomConvertible where Element : Codable , Element : PostgreSQLDataCustomConvertible {
105+ extension Array : PostgreSQLArrayCustomConvertible {
111106 /// See `PostgreSQLArrayCustomConvertible.postgreSQLDataArrayType`
112107 public static var postgreSQLDataArrayType : PostgreSQLDataType {
113- return Element . postgreSQLDataArrayType
108+ fatalError ( " Multi-dimensional arrays are not yet supported. " )
109+ }
110+
111+ /// See `PostgreSQLDataCustomConvertible.postgreSQLDataType`
112+ public static var postgreSQLDataType : PostgreSQLDataType {
113+ return requirePostgreSQLDataCustomConvertible ( Element . self) . postgreSQLDataArrayType
114114 }
115115
116116 /// See `PostgreSQLArrayCustomConvertible.PostgreSQLArrayElement`
@@ -126,3 +126,17 @@ extension Array: PostgreSQLArrayCustomConvertible where Element: Codable, Elemen
126126 return self
127127 }
128128}
129+
130+ func requirePostgreSQLDataCustomConvertible< T> ( _ type: T . Type ) -> PostgreSQLDataCustomConvertible . Type {
131+ guard let custom = T . self as? PostgreSQLDataCustomConvertible . Type else {
132+ fatalError ( " ` \( T . self) ` does not conform to `PostgreSQLDataCustomConvertible` " )
133+ }
134+ return custom
135+ }
136+
137+ func requirePostgreSQLDataCustomConvertible< T> ( _ type: T ) -> PostgreSQLDataCustomConvertible {
138+ guard let custom = type as? PostgreSQLDataCustomConvertible else {
139+ fatalError ( " ` \( T . self) ` does not conform to `PostgreSQLDataCustomConvertible` " )
140+ }
141+ return custom
142+ }
0 commit comments