mastodon-ios/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Server.swift

72 lines
2.3 KiB
Swift
Raw Normal View History

2021-02-18 12:36:49 +01:00
//
// Mastodon+API+Server.swift
//
//
// Created by MainasuK Cirno on 2021-2-18.
//
import Foundation
import Combine
extension Mastodon.API.Server {
static let serversEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("servers")
static let categoriesEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("categories")
public static func servers(
session: URLSession,
query: ServersQuery
) -> AnyPublisher<Mastodon.Response.Content<[Mastodon.Entity.Server]>, Error> {
let request = Mastodon.API.get(
url: serversEndpointURL,
query: query,
authorization: nil
)
return session.dataTaskPublisher(for: request)
.tryMap { data, response in
let value = try Mastodon.API.decode(type: [Mastodon.Entity.Server].self, from: data, response: response)
return Mastodon.Response.Content(value: value, response: response)
}
.eraseToAnyPublisher()
}
public static func categories(
session: URLSession
) -> AnyPublisher<Mastodon.Response.Content<[Mastodon.Entity.Category]>, Error> {
let request = Mastodon.API.get(
url: categoriesEndpointURL,
query: nil,
authorization: nil
)
return session.dataTaskPublisher(for: request)
.tryMap { data, response in
let value = try Mastodon.API.decode(type: [Mastodon.Entity.Category].self, from: data, response: response)
return Mastodon.Response.Content(value: value, response: response)
}
.eraseToAnyPublisher()
}
}
extension Mastodon.API.Server {
public struct ServersQuery: Codable, GetQuery {
public let language: String?
public let category: String?
public init(language: String?, category: String?) {
self.language = language
self.category = category
}
var queryItems: [URLQueryItem]? {
var items: [URLQueryItem] = []
language.flatMap { items.append(URLQueryItem(name: "language", value: $0)) }
category.flatMap { items.append(URLQueryItem(name: "category", value: $0)) }
guard !items.isEmpty else { return nil }
return items
}
}
}