// // FiatUnit.swift // BlueWallet // // Created by Marcos Rodriguez on 11/20/20. // Copyright © 2020 BlueWallet. All rights reserved. // import Foundation struct FiatUnit: Codable { let endPointKey: String let symbol: String let locale: String let source: String } func fiatUnit(currency: String) -> FiatUnit? { return Bundle.main.decode([String: FiatUnit].self, from: "fiatUnit.json").first(where: {$1.endPointKey == currency})?.value } extension Bundle { func decode(_ type: T.Type, from file: String, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .deferredToDate, keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .useDefaultKeys) -> T { guard let url = self.url(forResource: file, withExtension: nil) else { fatalError("Failed to locate \(file) in bundle.") } guard let data = try? Data(contentsOf: url) else { fatalError("Failed to load \(file) from bundle.") } let decoder = JSONDecoder() decoder.dateDecodingStrategy = dateDecodingStrategy decoder.keyDecodingStrategy = keyDecodingStrategy do { return try decoder.decode(T.self, from: data) } catch DecodingError.keyNotFound(let key, let context) { fatalError("Failed to decode \(file) from bundle due to missing key '\(key.stringValue)' not found – \(context.debugDescription)") } catch DecodingError.typeMismatch(_, let context) { fatalError("Failed to decode \(file) from bundle due to type mismatch – \(context.debugDescription)") } catch DecodingError.valueNotFound(let type, let context) { fatalError("Failed to decode \(file) from bundle due to missing \(type) value – \(context.debugDescription)") } catch DecodingError.dataCorrupted(_) { fatalError("Failed to decode \(file) from bundle because it appears to be invalid JSON") } catch { fatalError("Failed to decode \(file) from bundle: \(error.localizedDescription)") } } }