summaryrefslogtreecommitdiff
path: root/Sora/Data/Danbooru/DanbooruPostParser.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-23 09:14:04 -0800
committerFuwn <[email protected]>2026-02-23 13:33:42 -0800
commit0f53ed0fc04952fb2fb43518be11c545da535f5b (patch)
tree8b16594291ff7a5e7dd289193eaa1998030edefe /Sora/Data/Danbooru/DanbooruPostParser.swift
parent(no commit message) (diff)
downloadsora-testing-0f53ed0fc04952fb2fb43518be11c545da535f5b.tar.xz
sora-testing-0f53ed0fc04952fb2fb43518be11c545da535f5b.zip
fix: harden danbooru decoding and pagination flow
Diffstat (limited to 'Sora/Data/Danbooru/DanbooruPostParser.swift')
-rw-r--r--Sora/Data/Danbooru/DanbooruPostParser.swift24
1 files changed, 22 insertions, 2 deletions
diff --git a/Sora/Data/Danbooru/DanbooruPostParser.swift b/Sora/Data/Danbooru/DanbooruPostParser.swift
index f990ed5..1e5cdc4 100644
--- a/Sora/Data/Danbooru/DanbooruPostParser.swift
+++ b/Sora/Data/Danbooru/DanbooruPostParser.swift
@@ -1,6 +1,16 @@
import Foundation
nonisolated class DanbooruPostParser {
+ private struct FailableDecodable<Value: Decodable>: Decodable {
+ let value: Value?
+
+ init(from decoder: Decoder) throws {
+ let container = try decoder.singleValueContainer()
+
+ value = try? container.decode(Value.self)
+ }
+ }
+
private let data: Data
init(data: Data) {
@@ -17,10 +27,20 @@ nonisolated class DanbooruPostParser {
}
do {
- return try decoder.decode([DanbooruPost].self, from: data).compactMap { post in
- post.toBooruPost()
+ let decodedPosts = try decoder.decode([FailableDecodable<DanbooruPost>].self, from: data)
+ let validPosts = decodedPosts.compactMap(\.value)
+ let droppedRecordCount = decodedPosts.count - validPosts.count
+
+ if droppedRecordCount > 0 {
+ debugPrint(
+ "DanbooruPostParser.parse: dropped \(droppedRecordCount) malformed records while decoding page."
+ )
}
+
+ return validPosts.compactMap { post in post.toBooruPost() }
} catch {
+ debugPrint("DanbooruPostParser.parse: failed to decode response: \(error)")
+
return []
}
}