NetNewsWire/Frameworks/Account/NewsBlur/Models/NewsBlurFeed.swift

89 lines
2.2 KiB
Swift
Raw Normal View History

2020-03-10 04:26:48 +01:00
//
// NewsBlurFeed.swift
2020-03-10 04:26:48 +01:00
// Account
//
// Created by Anh Quang Do on 2020-03-09.
// Copyright (c) 2020 Ranchero Software, LLC. All rights reserved.
//
import Foundation
import RSCore
import RSParser
typealias NewsBlurFeed = NewsBlurFeedsResponse.Feed
typealias NewsBlurFolder = NewsBlurFeedsResponse.Folder
2020-03-10 04:26:48 +01:00
struct NewsBlurFeedsResponse: Decodable {
let feeds: [Feed]
2020-03-10 04:26:48 +01:00
let folders: [Folder]
struct Feed: Hashable, Codable {
let name: String
2020-03-13 23:57:38 +01:00
let feedID: Int
2020-03-10 04:26:48 +01:00
let feedURL: String
let homepageURL: String?
let faviconURL: String?
2020-03-10 04:26:48 +01:00
}
struct Folder: Hashable, Codable {
let name: String
2020-03-13 23:57:38 +01:00
let feedIDs: [Int]
2020-03-10 04:26:48 +01:00
}
}
struct NewsBlurFolderRelationship: Codable {
let folderName: String
let feedID: Int
}
2020-03-10 04:26:48 +01:00
extension NewsBlurFeedsResponse {
private enum CodingKeys: String, CodingKey {
case feeds = "feeds"
case folders = "flat_folders"
// TODO: flat_folders_with_inactive
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
// Parse feeds
var feeds: [Feed] = []
let feedContainer = try container.nestedContainer(keyedBy: NewsBlurGenericCodingKeys.self, forKey: .feeds)
try feedContainer.allKeys.forEach { key in
let subscription = try feedContainer.decode(Feed.self, forKey: key)
feeds.append(subscription)
2020-03-10 04:26:48 +01:00
}
// Parse folders
var folders: [Folder] = []
2020-03-11 02:08:56 +01:00
let folderContainer = try container.nestedContainer(keyedBy: NewsBlurGenericCodingKeys.self, forKey: .folders)
2020-03-14 02:18:29 +01:00
// Skip "everything" folder
for key in folderContainer.allKeys where key.stringValue != " " {
2020-03-10 04:26:48 +01:00
let subscriptionIds = try folderContainer.decode([Int].self, forKey: key)
2020-03-13 23:57:38 +01:00
let folder = Folder(name: key.stringValue, feedIDs: subscriptionIds)
2020-03-10 04:26:48 +01:00
folders.append(folder)
}
self.feeds = feeds
2020-03-10 04:26:48 +01:00
self.folders = folders
}
}
extension NewsBlurFeedsResponse.Feed {
2020-03-10 04:26:48 +01:00
private enum CodingKeys: String, CodingKey {
case name = "feed_title"
2020-03-13 23:57:38 +01:00
case feedID = "id"
2020-03-10 04:26:48 +01:00
case feedURL = "feed_address"
case homepageURL = "feed_link"
case faviconURL = "favicon_url"
}
}
extension NewsBlurFeedsResponse.Folder {
var asRelationships: [NewsBlurFolderRelationship] {
return feedIDs.map { NewsBlurFolderRelationship(folderName: name, feedID: $0) }
2020-03-10 04:26:48 +01:00
}
}