1→import Foundation 2→ 3→// MARK: - PTAX API Response Models 4→ 5→struct PTAXResponse: Codable { 6→ let value: [T] 7→ 8→ enum CodingKeys: String, CodingKey { 9→ case value 10→ } 11→} 12→ 13→struct CurrencyInfo: Codable, Identifiable, Hashable { 14→ var id: String { symbol } 15→ let symbol: String 16→ let formattedName: String 17→ let currencyType: String 18→ 19→ enum CodingKeys: String, CodingKey { 20→ case symbol = "simbolo" 21→ case formattedName = "nomeFormatado" 22→ case currencyType = "tipoMoeda" 23→ } 24→ 25→ var flag: String { 26→ switch symbol { 27→ case "USD": return "🇺🇸" 28→ case "EUR": return "🇪🇺" 29→ case "GBP": return "🇬🇧" 30→ case "JPY": return "🇯🇵" 31→ case "CHF": return "🇨🇭" 32→ case "CAD": return "🇨🇦" 33→ case "AUD": return "🇦🇺" 34→ case "CNY": return "🇨🇳" 35→ case "ARS": return "🇦🇷" 36→ case "MXN": return "🇲🇽" 37→ default: return "💱" 38→ } 39→ } 40→} 41→ 42→struct DollarQuote: Codable, Identifiable { 43→ var id: String { dataHoraCotacao } 44→ let buyRate: Double 45→ let sellRate: Double 46→ let dataHoraCotacao: String 47→ 48→ enum CodingKeys: String, CodingKey { 49→ case buyRate = "cotacaoCompra" 50→ case sellRate = "cotacaoVenda" 51→ case dataHoraCotacao 52→ } 53→ 54→ var dateTime: Date? { 55→ let formatter = DateFormatter() 56→ formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS" 57→ return formatter.date(from: dataHoraCotacao) 58→ } 59→ 60→ var formattedDate: String { 61→ guard let date = dateTime else { return dataHoraCotacao } 62→ let formatter = DateFormatter() 63→ formatter.dateFormat = "dd/MM/yyyy" 64→ return formatter.string(from: date) 65→ } 66→ 67→ var formattedTime: String { 68→ guard let date = dateTime else { return "--" } 69→ let formatter = DateFormatter() 70→ formatter.dateFormat = "HH:mm:ss" 71→ return formatter.string(from: date) 72→ } 73→} 74→ 75→struct CurrencyQuote: Codable, Identifiable { 76→ var id: String { "\(dataHoraCotacao)-\(tipoBoletim ?? "default")" } 77→ let parityBuy: Double? 78→ let paritySell: Double? 79→ let buyRate: Double 80→ let sellRate: Double 81→ let dataHoraCotacao: String 82→ let bulletinType: String? 83→ 84→ enum CodingKeys: String, CodingKey { 85→ case parityBuy = "paridadeCompra" 86→ case paritySell = "paridadeVenda" 87→ case buyRate = "cotacaoCompra" 88→ case sellRate = "cotacaoVenda" 89→ case dataHoraCotacao 90→ case bulletinType = "tipoBoletim" 91→ } 92→ 93→ var tipoBoletim: String? { bulletinType } 94→ 95→ var dateTime: Date? { 96→ let formatter = DateFormatter() 97→ formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS" 98→ if let date = formatter.date(from: dataHoraCotacao) { 99→ return date 100→ } 101→ formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SS" 102→ return formatter.date(from: dataHoraCotacao) 103→ } 104→ 105→ var formattedDate: String { 106→ guard let date = dateTime else { return dataHoraCotacao } 107→ let formatter = DateFormatter() 108→ formatter.dateFormat = "dd/MM/yyyy" 109→ return formatter.string(from: date) 110→ } 111→ 112→ var formattedTime: String { 113→ guard let date = dateTime else { return "--" } 114→ let formatter = DateFormatter() 115→ formatter.dateFormat = "HH:mm:ss" 116→ return formatter.string(from: date) 117→ } 118→ 119→ var isPTAXClosing: Bool { 120→ bulletinType?.lowercased().contains("fechamento") == true || 121→ bulletinType?.lowercased().contains("ptax") == true 122→ } 123→} 124→ 125→// MARK: - Display Model 126→ 127→struct CurrencyDisplayData: Identifiable { 128→ let id = UUID() 129→ let symbol: String 130→ let name: String 131→ let flag: String 132→ let buyRate: Double 133→ let sellRate: Double 134→ let change: Double 135→ let changePercent: Double 136→ let lastUpdate: Date? 137→ let history: [DollarQuote] 138→ 139→ var isPositive: Bool { change >= 0 } 140→ 141→ var formattedBuyRate: String { 142→ buyRate.toBRL() 143→ } 144→ 145→ var formattedSellRate: String { 146→ sellRate.toBRL() 147→ } 148→ 149→ var formattedChange: String { 150→ let prefix = change >= 0 ? "+" : "" 151→ return "\(prefix)\(String(format: "%.4f", change))" 152→ } 153→ 154→ var formattedChangePercent: String { 155→ let prefix = changePercent >= 0 ? "↑" : "↓" 156→ return "\(prefix) \(String(format: "%.2f", abs(changePercent)))%" 157→ } 158→} 159→ Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.