Tusker/Pachyderm/Utilities/InstanceSelector.swift

65 lines
2.0 KiB
Swift
Raw Permalink Normal View History

2019-09-15 19:01:35 +00:00
//
// InstanceSelector.swift
// Pachyderm
//
// Created by Shadowfacts on 9/15/19.
// Copyright © 2019 Shadowfacts. All rights reserved.
//
import Foundation
public class InstanceSelector {
private static let decoder = JSONDecoder()
public static func getInstances(category: String?, completion: @escaping Client.Callback<[Instance]>) {
let url: URL
if let category = category {
url = URL(string: "https://api.joinmastodon.org/servers?category=\(category)")!
} else {
url = URL(string: "https://api.joinmastodon.org/servers")!
}
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
2020-09-09 22:33:59 +00:00
completion(.failure(.networkError(error)))
2019-09-15 19:01:35 +00:00
return
}
guard let data = data,
let response = response as? HTTPURLResponse else {
2020-09-09 22:33:59 +00:00
completion(.failure(.invalidResponse))
2019-09-15 19:01:35 +00:00
return
}
guard response.statusCode == 200 else {
2020-09-09 22:33:59 +00:00
completion(.failure(.unexpectedStatus(response.statusCode)))
2019-09-15 19:01:35 +00:00
return
}
guard let result = try? decoder.decode([Instance].self, from: data) else {
completion(.failure(Client.Error.invalidModel))
return
}
completion(.success(result, nil))
}
task.resume()
}
}
public extension InstanceSelector {
struct Instance: Codable {
public let domain: String
public let description: String
public let proxiedThumbnailURL: URL
public let language: String
public let category: String
2019-09-15 19:01:35 +00:00
enum CodingKeys: String, CodingKey {
case domain
case description
case proxiedThumbnailURL = "proxied_thumbnail"
case language
case category
}
}
}