// // Instance.swift // Pachyderm // // Created by Shadowfacts on 9/9/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation public class Instance: Decodable { public let uri: String public let title: String public let description: String public let email: String? public let version: String public let urls: [String: URL] public let thumbnail: URL? public let languages: [String]? public let stats: Stats? // pleroma doesn't currently implement these public let contactAccount: Account? // MARK: Unofficial additions to the Mastodon API. public let maxStatusCharacters: Int? // we need a custom decoder, because all API-compatible implementations don't return some data in the same format public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.uri = try container.decode(String.self, forKey: .uri) self.title = try container.decode(String.self, forKey: .title) self.description = try container.decode(String.self, forKey: .description) self.email = try container.decodeIfPresent(String.self, forKey: .email) self.version = try container.decode(String.self, forKey: .version) if let urls = try? container.decodeIfPresent([String: URL].self, forKey: .urls) { self.urls = urls } else { self.urls = [:] } self.languages = try? container.decodeIfPresent([String].self, forKey: .languages) self.contactAccount = try? container.decodeIfPresent(Account.self, forKey: .contactAccount) self.stats = try? container.decodeIfPresent(Stats.self, forKey: .stats) self.thumbnail = try? container.decodeIfPresent(URL.self, forKey: .thumbnail) if let maxStatusCharacters = try? container.decodeIfPresent(Int.self, forKey: .maxStatusCharacters) { self.maxStatusCharacters = maxStatusCharacters } else if let str = try? container.decodeIfPresent(String.self, forKey: .maxStatusCharacters), let maxStatusCharacters = Int(str, radix: 10) { self.maxStatusCharacters = maxStatusCharacters } else { self.maxStatusCharacters = nil } } private enum CodingKeys: String, CodingKey { case uri case title case description case email case version case urls case thumbnail case languages case stats case contactAccount = "contact_account" case maxStatusCharacters = "max_toot_chars" } } extension Instance { public class Stats: Decodable { public let domainCount: Int? public let statusCount: Int? public let userCount: Int? private enum CodingKeys: String, CodingKey { case domainCount = "domain_count" case statusCount = "status_count" case userCount = "user_count" } } }