86 lines
2.5 KiB
Swift
86 lines
2.5 KiB
Swift
//
|
|
// FeedlyResourceId.swift
|
|
// Account
|
|
//
|
|
// Created by Kiel Gillard on 3/10/19.
|
|
// Copyright © 2019 Ranchero Software, LLC. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// The kinds of Resource Ids is documented here: https://developer.feedly.com/cloud/
|
|
protocol FeedlyResourceId {
|
|
|
|
/// The resource Id from Feedly.
|
|
var id: String { get }
|
|
}
|
|
|
|
/// The Feed Resource is documented here: https://developer.feedly.com/cloud/
|
|
struct FeedlyFeedResourceId: FeedlyResourceId {
|
|
let id: String
|
|
|
|
/// The location of the kind of resource a concrete type represents.
|
|
/// If the conrete type cannot strip the resource type from the Id, it should just return the Id
|
|
/// since the Id is a legitimate URL.
|
|
/// This is basically assuming Feedly prefixes source feed URLs with `feed/`.
|
|
/// It is not documented as such and could potentially change.
|
|
/// Feedly does not include the source feed URL as a separate field.
|
|
/// See https://developer.feedly.com/v3/feeds/#get-the-metadata-about-a-specific-feed
|
|
var url: String {
|
|
if let range = id.range(of: "feed/"), range.lowerBound == id.startIndex {
|
|
var mutant = id
|
|
mutant.removeSubrange(range)
|
|
return mutant
|
|
}
|
|
|
|
// It seems values like "something/https://my.blog/posts.xml" is a legit URL.
|
|
return id
|
|
}
|
|
}
|
|
|
|
extension FeedlyFeedResourceId {
|
|
init(url: String) {
|
|
self.id = "feed/\(url)"
|
|
}
|
|
}
|
|
|
|
struct FeedlyCategoryResourceId: FeedlyResourceId {
|
|
let id: String
|
|
|
|
enum Global {
|
|
|
|
static func uncategorized(for userId: String) -> FeedlyCategoryResourceId {
|
|
// https://developer.feedly.com/cloud/#global-resource-ids
|
|
let id = "user/\(userId)/category/global.uncategorized"
|
|
return FeedlyCategoryResourceId(id: id)
|
|
}
|
|
|
|
/// All articles from all the feeds the user subscribes to.
|
|
static func all(for userId: String) -> FeedlyCategoryResourceId {
|
|
// https://developer.feedly.com/cloud/#global-resource-ids
|
|
let id = "user/\(userId)/category/global.all"
|
|
return FeedlyCategoryResourceId(id: id)
|
|
}
|
|
|
|
/// All articles from all the feeds the user loves most.
|
|
static func mustRead(for userId: String) -> FeedlyCategoryResourceId {
|
|
// https://developer.feedly.com/cloud/#global-resource-ids
|
|
let id = "user/\(userId)/category/global.must"
|
|
return FeedlyCategoryResourceId(id: id)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct FeedlyTagResourceId: FeedlyResourceId {
|
|
let id: String
|
|
|
|
enum Global {
|
|
|
|
static func saved(for userId: String) -> FeedlyTagResourceId {
|
|
// https://developer.feedly.com/cloud/#global-resource-ids
|
|
let id = "user/\(userId)/tag/global.saved"
|
|
return FeedlyTagResourceId(id: id)
|
|
}
|
|
}
|
|
}
|