From b0d64e2b5b910eaeb4b5cf7c839bcf52a94c0487 Mon Sep 17 00:00:00 2001 From: Anton Stavnichiy Date: Tue, 11 Feb 2025 09:41:09 +0600 Subject: [PATCH] Add with-top-coins flag to coin categories --- Sources/MarketKit/Classes/Kit.swift | 4 +-- .../Classes/Models/CoinCategory.swift | 9 ++++-- .../Classes/Models/CoinPriceResponse.swift | 2 +- .../Classes/Models/HsTimePeriod.swift | 28 +++++++++---------- .../Classes/Providers/HsProvider.swift | 8 ++++-- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Sources/MarketKit/Classes/Kit.swift b/Sources/MarketKit/Classes/Kit.swift index 813284d..5c0b8c1 100644 --- a/Sources/MarketKit/Classes/Kit.swift +++ b/Sources/MarketKit/Classes/Kit.swift @@ -174,8 +174,8 @@ public extension Kit { // Categories - func coinCategories(currencyCode: String) async throws -> [CoinCategory] { - try await hsProvider.coinCategories(currencyCode: currencyCode) + func coinCategories(currencyCode: String, withTopCoins: Bool = false) async throws -> [CoinCategory] { + try await hsProvider.coinCategories(currencyCode: currencyCode, withTopCoins: withTopCoins) } func coinCategoryMarketCapChart(category: String, currencyCode: String?, timePeriod: HsTimePeriod) async throws -> [CategoryMarketPoint] { diff --git a/Sources/MarketKit/Classes/Models/CoinCategory.swift b/Sources/MarketKit/Classes/Models/CoinCategory.swift index 667351f..a778486 100644 --- a/Sources/MarketKit/Classes/Models/CoinCategory.swift +++ b/Sources/MarketKit/Classes/Models/CoinCategory.swift @@ -2,7 +2,7 @@ import Foundation import ObjectMapper public class CoinCategory: ImmutableMappable { - public let id: Int + public let id: Int? public let uid: String public let name: String public let descriptions: [String: String] @@ -10,9 +10,10 @@ public class CoinCategory: ImmutableMappable { public let diff24H: Decimal? public let diff1W: Decimal? public let diff1M: Decimal? + public let topCoins: [String]? public required init(map: Map) throws { - id = try map.value("id") + id = try? map.value("id") uid = try map.value("uid") name = try map.value("name") descriptions = try map.value("description") @@ -21,6 +22,8 @@ public class CoinCategory: ImmutableMappable { diff24H = try? map.value("change_24h", using: Transform.stringToDecimalTransform) diff1W = try? map.value("change_1w", using: Transform.stringToDecimalTransform) diff1M = try? map.value("change_1m", using: Transform.stringToDecimalTransform) + + topCoins = try? map.value("top_coins") } } @@ -38,6 +41,6 @@ public extension CoinCategory { extension CoinCategory: CustomStringConvertible { public var description: String { - "CoinCategory [uid: \(uid); id: \(id); name: \(name); descriptionCount: \(descriptions.count)]" + "CoinCategory [uid: \(uid); id: \(id ?? -1); name: \(name); descriptionCount: \(descriptions.count)]" } } diff --git a/Sources/MarketKit/Classes/Models/CoinPriceResponse.swift b/Sources/MarketKit/Classes/Models/CoinPriceResponse.swift index 1375ca0..fb5cc70 100644 --- a/Sources/MarketKit/Classes/Models/CoinPriceResponse.swift +++ b/Sources/MarketKit/Classes/Models/CoinPriceResponse.swift @@ -9,7 +9,7 @@ struct CoinPriceResponse: ImmutableMappable { let priceChange1d: Decimal? let lastUpdated: TimeInterval - init(uid: String, price: Decimal, priceChange: Decimal?, priceChange24h: Decimal?, priceChange1d: Decimal?, lastUpdated: TimeInterval) { + init(uid: String, price: Decimal, priceChange _: Decimal?, priceChange24h: Decimal?, priceChange1d: Decimal?, lastUpdated: TimeInterval) { self.uid = uid self.price = price self.priceChange24h = priceChange24h diff --git a/Sources/MarketKit/Classes/Models/HsTimePeriod.swift b/Sources/MarketKit/Classes/Models/HsTimePeriod.swift index ff4fe12..0d5577b 100644 --- a/Sources/MarketKit/Classes/Models/HsTimePeriod.swift +++ b/Sources/MarketKit/Classes/Models/HsTimePeriod.swift @@ -16,25 +16,25 @@ public enum HsTimePeriod: String, CaseIterable { private var range: TimeInterval { switch self { - case .hour24: return .days(1) - case .day1: return 0 - case .week1: return .days(7) - case .week2: return .days(14) - case .month1: return .days(30) - case .month3: return .days(90) - case .month6: return .days(180) - case .year1: return .days(365) - case .year2: return 2 * .days(365) - case .year5: return 5 * .days(365) + case .hour24: return .days(1) + case .day1: return 0 + case .week1: return .days(7) + case .week2: return .days(14) + case .month1: return .days(30) + case .month3: return .days(90) + case .month6: return .days(180) + case .year1: return .days(365) + case .year2: return 2 * .days(365) + case .year5: return 5 * .days(365) } } var startTimestamp: TimeInterval { switch self { - case .day1: - return .midnightUTC() + .minutes(1) - default: - return Date().timeIntervalSince1970 - range + case .day1: + return .midnightUTC() + .minutes(1) + default: + return Date().timeIntervalSince1970 - range } } } diff --git a/Sources/MarketKit/Classes/Providers/HsProvider.swift b/Sources/MarketKit/Classes/Providers/HsProvider.swift index 8c5e485..e4eefce 100644 --- a/Sources/MarketKit/Classes/Providers/HsProvider.swift +++ b/Sources/MarketKit/Classes/Providers/HsProvider.swift @@ -182,13 +182,17 @@ extension HsProvider { // Coin Categories - func coinCategories(currencyCode: String? = nil) async throws -> [CoinCategory] { + func coinCategories(currencyCode: String? = nil, withTopCoins: Bool = false) async throws -> [CoinCategory] { var parameters: Parameters = [:] if let currencyCode { parameters["currency"] = currencyCode.lowercased() } - return try await networkManager.fetch(url: "\(baseUrl)/v1/categories", method: .get, parameters: parameters, headers: headers) + var url = "\(baseUrl)/v1/categories" + if withTopCoins { + url += "/with-top-coins" + } + return try await networkManager.fetch(url: url, method: .get, parameters: parameters, headers: headers) } func coinCategoryMarketCapChart(category: String, currencyCode: String?, timePeriod: HsTimePeriod) async throws -> [CategoryMarketPoint] {