Skip to content

Commit 2abd795

Browse files
authored
Merge pull request #180 from sebj/reuse-rfc-3339-dateformatter
Reuse `RFC3339DateFormatter` when encoding/decoding a `JSONFeed`
2 parents 9d608c5 + b671729 commit 2abd795

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

Sources/FeedKit/FeedDateFormatter.swift

+11-7
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class PermissiveDateFormatter: DateFormatter, @unchecked Sendable {
8989
// MARK: - ISO8601 formatter
9090

9191
/// Formatter for ISO8601 date specification.
92-
class ISO8601DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
92+
final class ISO8601DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
9393
/// List of date formats supported for ISO8601.
9494
override var dateFormats: [String] {
9595
[
@@ -112,7 +112,7 @@ class ISO8601DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
112112
// MARK: - RFC3339 formatter
113113

114114
/// Formatter for RFC3339 date specification.
115-
class RFC3339DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
115+
final class RFC3339DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
116116
/// List of date formats supported for RFC3339.
117117
override var dateFormats: [String] {
118118
[
@@ -133,10 +133,14 @@ class RFC3339DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
133133
}
134134
}
135135

136+
extension RFC3339DateFormatter {
137+
static let shared = RFC3339DateFormatter()
138+
}
139+
136140
// MARK: - RFC822 formatter
137141

138142
/// Formatter for RFC822 date specification with backup formats.
139-
class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
143+
final class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
140144
/// List of date formats supported for RFC822.
141145
override var dateFormats: [String] {
142146
[
@@ -195,7 +199,7 @@ class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
195199
// MARK: - RFC1123 formatter
196200

197201
/// Formatter for RFC1123 date specification.
198-
class RFC1123DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
202+
final class RFC1123DateFormatter: PermissiveDateFormatter, @unchecked Sendable {
199203
/// List of date formats supported for RFC1123.
200204
override var dateFormats: [String] {
201205
[
@@ -230,8 +234,8 @@ enum DateSpec {
230234

231235
// MARK: - FeedDateFormatter
232236

233-
/// A formatter that handles multiple date specifications (ISO8601, RFC3339, RFC822).
234-
class FeedDateFormatter: DateFormatter, @unchecked Sendable {
237+
/// A formatter that handles multiple date specifications (ISO8601, RFC3339, RFC822, RFC1123).
238+
final class FeedDateFormatter: DateFormatter, @unchecked Sendable {
235239
// MARK: Lifecycle
236240

237241
/// Initializes the date formatter with a specified date format.
@@ -256,7 +260,7 @@ class FeedDateFormatter: DateFormatter, @unchecked Sendable {
256260
lazy var iso8601Formatter: ISO8601DateFormatter = .init()
257261

258262
/// RFC3339 date formatter.
259-
lazy var rfc3339Formatter: RFC3339DateFormatter = .init()
263+
lazy var rfc3339Formatter: RFC3339DateFormatter = .shared
260264

261265
/// RFC822 date formatter.
262266
lazy var rfc822Formatter: RFC822DateFormatter = .init()

Sources/FeedKit/Feeds/JSON/JSONFeed.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ extension JSONFeed: Codable {
203203

204204
extension JSONFeed: FeedInitializable {
205205
public init(data: Data) throws {
206-
let formatter: RFC3339DateFormatter = .init()
206+
let formatter: RFC3339DateFormatter = .shared
207207
let decoder: JSONDecoder = .init()
208208
decoder.dateDecodingStrategy = .formatted(formatter)
209209
self = try decoder.decode(JSONFeed.self, from: data)
@@ -213,7 +213,7 @@ extension JSONFeed: FeedInitializable {
213213
public extension JSONFeed {
214214
func toJSONString(formatted: Bool) throws -> String {
215215
let encoder: JSONEncoder = .init()
216-
encoder.dateEncodingStrategy = .formatted(RFC3339DateFormatter())
216+
encoder.dateEncodingStrategy = .formatted(RFC3339DateFormatter.shared)
217217
encoder.outputFormatting = formatted ? [.prettyPrinted] : []
218218
let data = try encoder.encode(self)
219219
guard let string = String(data: data, encoding: .utf8) else {

0 commit comments

Comments
 (0)