6
6
//
7
7
8
8
import Foundation
9
- import PostgREST
10
9
11
- public enum RealtimeChannelV2Filter {
12
- case eq( column: String , value: any URLQueryRepresentable )
13
- case neq( column: String , value: any URLQueryRepresentable )
14
- case gt( column: String , value: any URLQueryRepresentable )
15
- case gte( column: String , value: any URLQueryRepresentable )
16
- case lt( column: String , value: any URLQueryRepresentable )
17
- case lte( column: String , value: any URLQueryRepresentable )
18
- case `in`( column: String , values: [ any URLQueryRepresentable ] )
10
+ /// A value that can be used to filter Realtime changes in a channel.
11
+ public protocol RealtimeFilterValue {
12
+ var rawValue : String { get }
13
+ }
14
+
15
+ extension String : RealtimeFilterValue {
16
+ public var rawValue : String { self }
17
+ }
18
+
19
+ extension Int : RealtimeFilterValue {
20
+ public var rawValue : String { " \( self ) " }
21
+ }
22
+
23
+ extension Double : RealtimeFilterValue {
24
+ public var rawValue : String { " \( self ) " }
25
+ }
26
+
27
+ extension Bool : RealtimeFilterValue {
28
+ public var rawValue : String { " \( self ) " }
29
+ }
30
+
31
+ extension UUID : RealtimeFilterValue {
32
+ public var rawValue : String { uuidString }
33
+ }
34
+
35
+ extension Date : RealtimeFilterValue {
36
+ public var rawValue : String {
37
+ let formatter = ISO8601DateFormatter ( )
38
+ formatter. formatOptions = [ . withInternetDateTime, . withFractionalSeconds]
39
+ return formatter. string ( from: self )
40
+ }
41
+ }
42
+
43
+ extension Array : RealtimeFilterValue where Element: RealtimeFilterValue {
44
+ public var rawValue : String {
45
+ map ( \. rawValue) . joined ( separator: " , " )
46
+ }
47
+ }
48
+
49
+ public enum RealtimeFilter {
50
+ case eq( _ column: String , value: any RealtimeFilterValue )
51
+ case neq( _ column: String , value: any RealtimeFilterValue )
52
+ case gt( _ column: String , value: any RealtimeFilterValue )
53
+ case gte( _ column: String , value: any RealtimeFilterValue )
54
+ case lt( _ column: String , value: any RealtimeFilterValue )
55
+ case lte( _ column: String , value: any RealtimeFilterValue )
56
+ case `in`( _ column: String , values: [ any RealtimeFilterValue ] )
19
57
20
58
var value : String {
21
59
switch self {
22
60
case let . eq( column, value) :
23
- return " \( column) =eq. \( value. queryValue ) "
61
+ return " \( column) =eq. \( value. rawValue ) "
24
62
case let . neq( column, value) :
25
- return " \( column) =neq. \( value. queryValue ) "
63
+ return " \( column) =neq. \( value. rawValue ) "
26
64
case let . gt( column, value) :
27
- return " \( column) =gt. \( value. queryValue ) "
65
+ return " \( column) =gt. \( value. rawValue ) "
28
66
case let . gte( column, value) :
29
- return " \( column) =gte. \( value. queryValue ) "
67
+ return " \( column) =gte. \( value. rawValue ) "
30
68
case let . lt( column, value) :
31
- return " \( column) =lt. \( value. queryValue ) "
69
+ return " \( column) =lt. \( value. rawValue ) "
32
70
case let . lte( column, value) :
33
- return " \( column) =lte. \( value. queryValue ) "
71
+ return " \( column) =lte. \( value. rawValue ) "
34
72
case let . in( column, values) :
35
- return " \( column) =in.( \( values. map ( \. queryValue ) . joined ( separator : " , " ) ) ) "
73
+ return " \( column) =in.( \( values. map ( \. rawValue ) ) ) "
36
74
}
37
75
}
38
76
}
@@ -58,7 +96,7 @@ extension RealtimeChannelV2 {
58
96
_: InsertAction . Type ,
59
97
schema: String = " public " ,
60
98
table: String ? = nil ,
61
- filter: RealtimeChannelV2Filter ? = nil
99
+ filter: RealtimeFilter ? = nil
62
100
) -> AsyncStream < InsertAction > {
63
101
postgresChange ( event: . insert, schema: schema, table: table, filter: filter? . value)
64
102
. compactErase ( )
@@ -70,6 +108,7 @@ extension RealtimeChannelV2 {
70
108
deprecated,
71
109
message: " Use the new filter syntax instead. "
72
110
)
111
+ @_disfavoredOverload
73
112
public func postgresChange(
74
113
_: InsertAction . Type ,
75
114
schema: String = " public " ,
@@ -85,7 +124,7 @@ extension RealtimeChannelV2 {
85
124
_: UpdateAction . Type ,
86
125
schema: String = " public " ,
87
126
table: String ? = nil ,
88
- filter: RealtimeChannelV2Filter ? = nil
127
+ filter: RealtimeFilter ? = nil
89
128
) -> AsyncStream < UpdateAction > {
90
129
postgresChange ( event: . update, schema: schema, table: table, filter: filter? . value)
91
130
. compactErase ( )
@@ -97,6 +136,7 @@ extension RealtimeChannelV2 {
97
136
deprecated,
98
137
message: " Use the new filter syntax instead. "
99
138
)
139
+ @_disfavoredOverload
100
140
public func postgresChange(
101
141
_: UpdateAction . Type ,
102
142
schema: String = " public " ,
@@ -112,7 +152,7 @@ extension RealtimeChannelV2 {
112
152
_: DeleteAction . Type ,
113
153
schema: String = " public " ,
114
154
table: String ? = nil ,
115
- filter: RealtimeChannelV2Filter ? = nil
155
+ filter: RealtimeFilter ? = nil
116
156
) -> AsyncStream < DeleteAction > {
117
157
postgresChange ( event: . delete, schema: schema, table: table, filter: filter? . value)
118
158
. compactErase ( )
@@ -124,6 +164,7 @@ extension RealtimeChannelV2 {
124
164
deprecated,
125
165
message: " Use the new filter syntax instead. "
126
166
)
167
+ @_disfavoredOverload
127
168
public func postgresChange(
128
169
_: DeleteAction . Type ,
129
170
schema: String = " public " ,
@@ -139,7 +180,7 @@ extension RealtimeChannelV2 {
139
180
_: AnyAction . Type ,
140
181
schema: String = " public " ,
141
182
table: String ? = nil ,
142
- filter: RealtimeChannelV2Filter ? = nil
183
+ filter: RealtimeFilter ? = nil
143
184
) -> AsyncStream < AnyAction > {
144
185
postgresChange ( event: . all, schema: schema, table: table, filter: filter? . value)
145
186
}
@@ -150,6 +191,7 @@ extension RealtimeChannelV2 {
150
191
deprecated,
151
192
message: " Use the new filter syntax instead. "
152
193
)
194
+ @_disfavoredOverload
153
195
public func postgresChange(
154
196
_: AnyAction . Type ,
155
197
schema: String = " public " ,
0 commit comments