@@ -38,7 +38,9 @@ public protocol PubNubMessage {
3838 var metadata : JSONCodable ? { get set }
3939 /// The type of message that was received
4040 var messageType : PubNubMessageType { get set }
41-
41+ /// An error (if any) occured while getting this message
42+ var error : PubNubError ? { get set }
43+
4244 /// Allows for transcoding between different MessageEvent types
4345 init ( from other: PubNubMessage ) throws
4446}
@@ -69,16 +71,17 @@ public extension PubNubMessage {
6971
7072/// The default implementation of the `PubNubMessage` protocol
7173public struct PubNubMessageBase : PubNubMessage , Codable , Hashable {
72- var concretePayload : AnyJSON
7374 public var publisher : String ?
74- var concreteMessageActions : [ PubNubMessageActionBase ]
7575 public var channel : String
7676 public var subscription : String ?
7777 public var published : Timetoken
78- var concreteMetadata : AnyJSON ?
79-
8078 public var messageType : PubNubMessageType
81-
79+ public var error : PubNubError ?
80+
81+ var concretePayload : AnyJSON
82+ var concreteMessageActions : [ PubNubMessageActionBase ]
83+ var concreteMetadata : AnyJSON ?
84+
8285 public var payload : JSONCodable {
8386 get { return concretePayload }
8487 set {
@@ -109,7 +112,8 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
109112 subscription: other. subscription,
110113 published: other. published,
111114 metadata: other. metadata? . codableValue,
112- messageType: other. messageType
115+ messageType: other. messageType,
116+ error: other. error
113117 )
114118 }
115119
@@ -122,7 +126,8 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
122126 subscription: subscribe. subscription,
123127 published: subscribe. publishTimetoken. timetoken,
124128 metadata: subscribe. metadata,
125- messageType: subscribe. messageType. asPubNubMessageType
129+ messageType: subscribe. messageType. asPubNubMessageType,
130+ error: subscribe. error
126131 )
127132 }
128133
@@ -141,7 +146,8 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
141146 subscription: nil ,
142147 published: history. timetoken,
143148 metadata: history. meta,
144- messageType: history. messageType ?? . unknown
149+ messageType: history. messageType ?? . unknown,
150+ error: history. error
145151 )
146152 }
147153
@@ -153,16 +159,55 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
153159 subscription: String ? ,
154160 published: Timetoken ,
155161 metadata: AnyJSON ? ,
156- messageType: PubNubMessageType = . unknown
162+ messageType: PubNubMessageType = . unknown,
163+ error: PubNubError ? = nil
157164 ) {
158- concretePayload = payload
159- concreteMessageActions = actions
165+ self . concretePayload = payload
166+ self . concreteMessageActions = actions
160167 self . publisher = publisher
161168 self . channel = channel
162169 self . subscription = subscription
163170 self . published = published
164- concreteMetadata = metadata
171+ self . concreteMetadata = metadata
165172 self . messageType = messageType
173+ self . error = error
174+ }
175+
176+ public func encode( to encoder: Encoder ) throws {
177+ var container = encoder. container ( keyedBy: CodingKeys . self)
178+
179+ try container. encode ( self . concretePayload, forKey: . concretePayload)
180+ try container. encodeIfPresent ( self . publisher, forKey: . publisher)
181+ try container. encode ( self . concreteMessageActions, forKey: . concreteMessageActions)
182+ try container. encode ( self . channel, forKey: . channel)
183+ try container. encodeIfPresent ( self . subscription, forKey: . subscription)
184+ try container. encode ( self . published, forKey: . published)
185+ try container. encodeIfPresent ( self . concreteMetadata, forKey: . concreteMetadata)
186+ try container. encode ( self . messageType, forKey: . messageType)
187+ }
188+
189+ enum CodingKeys : CodingKey {
190+ case concretePayload
191+ case publisher
192+ case concreteMessageActions
193+ case channel
194+ case subscription
195+ case published
196+ case concreteMetadata
197+ case messageType
198+ }
199+
200+ public init ( from decoder: Decoder ) throws {
201+ let container = try decoder. container ( keyedBy: CodingKeys . self)
202+
203+ self . concretePayload = try container. decode ( AnyJSON . self, forKey: . concretePayload)
204+ self . publisher = try container. decodeIfPresent ( String . self, forKey: . publisher)
205+ self . concreteMessageActions = try container. decode ( [ PubNubMessageActionBase ] . self, forKey: . concreteMessageActions)
206+ self . channel = try container. decode ( String . self, forKey: . channel)
207+ self . subscription = try container. decodeIfPresent ( String . self, forKey: . subscription)
208+ self . published = try container. decode ( Timetoken . self, forKey: . published)
209+ self . concreteMetadata = try container. decodeIfPresent ( AnyJSON . self, forKey: . concreteMetadata)
210+ self . messageType = try container. decode ( PubNubMessageType . self, forKey: . messageType)
166211 }
167212}
168213
0 commit comments