import Foundation /// Сводка по торговой паре из `GET /market/symbol-thumb`. /// /// Нюанс нейминга: API Rapira меняет местами base и quote относительно /// привычной терминологии — для пары "BTC/USDT" `quoteCurrency == "BTC"` /// (монета), а `baseCurrency == "USDT"` (валюта, в которой выражена цена). struct SymbolThumb: Codable, Identifiable, Sendable { var id: String { symbol } let symbol: String let open: Double let high: Double let low: Double let close: Double /// Относительное изменение за 24ч (0.0234 == +2.34%). let chg: Double /// Абсолютное изменение за 24ч в валюте цены. let change: Double let volume: Double let turnover: Double let quoteCurrencyName: String let baseCurrency: String let quoteCurrency: String } // MARK: - Представление extension SymbolThumb { var isPositive: Bool { chg >= 0 } /// «70 324,00» var priceFormatted: String { MarketFormatting.price(close) } /// «+2.34%» var changePercent: String { MarketFormatting.percent(chg, signed: true) } /// «2.34%» — без знака, когда знак уже несёт соседнее значение. var changePercentPlain: String { MarketFormatting.percent(abs(chg), signed: false) } /// «+1 676,00 USDT» var changeFormatted: String { "\(MarketFormatting.signedAmount(change)) \(baseSymbol)" } /// Символ валюты цены: ₽ вместо RUB и т.п. var baseSymbol: String { switch baseCurrency { case "RUB": "₽" case "USD": "$" case "EUR": "€" default: baseCurrency } } }