Skip to content

Commit 8ab5420

Browse files
committed
Simpler and more resilient parsing
1 parent 1659403 commit 8ab5420

File tree

1 file changed

+24
-20
lines changed

1 file changed

+24
-20
lines changed

Modules/Sources/WordPressKit/ReaderFeed.swift

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,31 +52,26 @@ public struct ReaderFeed: Decodable {
5252
/// Site data from meta.data.site
5353
private var site: SiteData?
5454

55-
private enum CodingKeys: CodingKey {
56-
case meta
55+
public init(from decoder: Decoder) throws {
56+
let parsed = try ReaderFeedJSON(from: decoder)
57+
self.feed = parsed.meta?.data?.feed
58+
self.site = parsed.meta?.data?.site
5759
}
60+
}
5861

59-
private enum MetaKeys: CodingKey {
60-
case data
61-
}
62+
private struct ReaderFeedJSON: Decodable {
63+
struct Meta: Decodable {
64+
struct Data: Decodable {
65+
var feed: FeedData?
66+
var site: SiteData?
67+
}
6268

63-
private enum DataKeys: CodingKey {
64-
case site
65-
case feed
69+
var data: Data?
6670
}
6771

68-
public init(from decoder: Decoder) throws {
69-
let root = try decoder.container(keyedBy: CodingKeys.self)
70-
if let meta = try? root.nestedContainer(keyedBy: MetaKeys.self, forKey: .meta),
71-
let data = try? meta.nestedContainer(keyedBy: DataKeys.self, forKey: .data) {
72-
self.feed = try? data.decode(FeedData.self, forKey: .feed)
73-
self.site = try? data.decode(SiteData.self, forKey: .site)
74-
}
75-
}
72+
var meta: Meta?
7673
}
7774

78-
// MARK: - Feed Data
79-
8075
/// Represents feed-specific data from meta.data.feed
8176
private struct FeedData: Decodable {
8277
let feedID: String?
@@ -94,9 +89,18 @@ private struct FeedData: Decodable {
9489
case description = "description"
9590
case imageURL = "image"
9691
}
97-
}
9892

99-
// MARK: - Site Data
93+
init(from decoder: Decoder) throws {
94+
let container = try decoder.container(keyedBy: CodingKeys.self)
95+
96+
feedID = try? container.decodeIfPresent(String.self, forKey: .feedID)
97+
blogID = try? container.decodeIfPresent(String.self, forKey: .blogID)
98+
name = try? container.decodeIfPresent(String.self, forKey: .name)
99+
url = try? container.decodeIfPresent(URL.self, forKey: .url)
100+
description = try? container.decodeIfPresent(String.self, forKey: .description)
101+
imageURL = try? container.decodeIfPresent(URL.self, forKey: .imageURL)
102+
}
103+
}
100104

101105
/// Represents site-specific data from meta.data.site
102106
private struct SiteData: Decodable {

0 commit comments

Comments
 (0)