changeset 150:6eac99e99b96

Add error handling to read json function
author Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
date Thu, 19 Aug 2021 19:12:56 +0100
parents 07b5d7386e6e
children bdedd0cc6cd1
files Simoleon.xcodeproj/project.pbxproj Simoleon/Conversion.swift Simoleon/ErrorHandling.swift Simoleon/Functions/ParseJson.swift Simoleon/Functions/Read.swift Simoleon/Helpers/ConversionBox.swift Simoleon/Helpers/CurrencyRow.swift Simoleon/Helpers/CurrencySelector.swift Simoleon/Settings.swift
diffstat 9 files changed, 58 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/Simoleon.xcodeproj/project.pbxproj	Thu Aug 19 19:12:31 2021 +0100
+++ b/Simoleon.xcodeproj/project.pbxproj	Thu Aug 19 19:12:56 2021 +0100
@@ -12,7 +12,8 @@
 		950A377826A820F800CAB175 /* DefaultCurrency+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950A377526A820F400CAB175 /* DefaultCurrency+CoreDataClass.swift */; };
 		9522BEA926B5A4D20076B098 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9522BEA826B5A4D20076B098 /* AppDelegate.swift */; };
 		9522BEAB26B5AACB0076B098 /* ListModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9522BEAA26B5AACB0076B098 /* ListModifier.swift */; };
-		9555933A269B0AB8000FD726 /* ParseJson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95559339269B0AB8000FD726 /* ParseJson.swift */; };
+		9522CD9D26CED2E100DD9D03 /* ErrorHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9522CD9C26CED2E100DD9D03 /* ErrorHandling.swift */; };
+		9555933A269B0AB8000FD726 /* Read.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95559339269B0AB8000FD726 /* Read.swift */; };
 		95561E3F26AF25EF00CCB543 /* SubscriptionFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95561E3E26AF25EF00CCB543 /* SubscriptionFeature.swift */; };
 		95562D4D26A8962A0047E778 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95562D4C26A8962A0047E778 /* StoreKit.framework */; };
 		95562D5226A8AEF60047E778 /* Purchases in Frameworks */ = {isa = PBXBuildFile; productRef = 95562D5126A8AEF60047E778 /* Purchases */; };
@@ -111,7 +112,8 @@
 		950A377626A820F400CAB175 /* DefaultCurrency+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DefaultCurrency+CoreDataProperties.swift"; sourceTree = "<group>"; };
 		9522BEA826B5A4D20076B098 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		9522BEAA26B5AACB0076B098 /* ListModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListModifier.swift; sourceTree = "<group>"; };
-		95559339269B0AB8000FD726 /* ParseJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseJson.swift; sourceTree = "<group>"; };
+		9522CD9C26CED2E100DD9D03 /* ErrorHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorHandling.swift; sourceTree = "<group>"; };
+		95559339269B0AB8000FD726 /* Read.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Read.swift; sourceTree = "<group>"; };
 		95561E3E26AF25EF00CCB543 /* SubscriptionFeature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionFeature.swift; sourceTree = "<group>"; };
 		95562D4C26A8962A0047E778 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
 		956088B526B9307600A4FD6C /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SnapshotHelper.swift; path = fastlane/SnapshotHelper.swift; sourceTree = "<group>"; };
@@ -261,7 +263,7 @@
 		95559338269B0AAA000FD726 /* Functions */ = {
 			isa = PBXGroup;
 			children = (
-				95559339269B0AB8000FD726 /* ParseJson.swift */,
+				95559339269B0AB8000FD726 /* Read.swift */,
 				9585BB1126A6B71B00E3193E /* ReadConfig.swift */,
 				9585BB1326A6B7F400E3193E /* NetworkRequest.swift */,
 				9585BB1926A6E8FD00E3193E /* SimpleSuccess.swift */,
@@ -370,6 +372,7 @@
 				95D8C8C626A95D2900BCC188 /* SubscriptionPaywall.swift */,
 				95C5B22B2697752700941585 /* Assets.xcassets */,
 				95C5B2302697752700941585 /* Persistence.swift */,
+				9522CD9C26CED2E100DD9D03 /* ErrorHandling.swift */,
 				95C5B2352697752700941585 /* Info.plist */,
 				95C5B2322697752700941585 /* Simoleon.xcdatamodeld */,
 				95E76435269DFC1A008E9F31 /* LaunchScreen.storyboard */,
@@ -672,6 +675,7 @@
 				95C5179926A5EC9F00BC2B24 /* FavoriteButton.swift in Sources */,
 				95C5179C26A5EFBE00BC2B24 /* Favorite+CoreDataClass.swift in Sources */,
 				950A377826A820F800CAB175 /* DefaultCurrency+CoreDataClass.swift in Sources */,
+				9522CD9D26CED2E100DD9D03 /* ErrorHandling.swift in Sources */,
 				95C5B2312697752700941585 /* Persistence.swift in Sources */,
 				9585BB1226A6B71B00E3193E /* ReadConfig.swift in Sources */,
 				95AEBC9526A03ECB00613729 /* ContentView.swift in Sources */,
@@ -682,7 +686,7 @@
 				95D8C8CD26A9784500BCC188 /* SubscribeButton.swift in Sources */,
 				950A377726A820F800CAB175 /* DefaultCurrency+CoreDataProperties.swift in Sources */,
 				9585BB1A26A6E8FD00E3193E /* SimpleSuccess.swift in Sources */,
-				9555933A269B0AB8000FD726 /* ParseJson.swift in Sources */,
+				9555933A269B0AB8000FD726 /* Read.swift in Sources */,
 				95D8C8CF26A98A7900BCC188 /* RestoreButton.swift in Sources */,
 				95C5179D26A5EFBE00BC2B24 /* Favorite+CoreDataProperties.swift in Sources */,
 				95C5179F26A5F34200BC2B24 /* Favorites.swift in Sources */,
--- a/Simoleon/Conversion.swift	Thu Aug 19 19:12:31 2021 +0100
+++ b/Simoleon/Conversion.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -18,8 +18,6 @@
     @State private var showingCurrencySelector = false
     @State private var amountIsEditing = false
     
-    let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
-    
     var body: some View {
         ScrollView(showsIndicators: false) {
             VStack(alignment: .leading) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/ErrorHandling.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -0,0 +1,14 @@
+//
+//  ErrorHandling.swift
+//  Simoleon
+//
+//  Created by Dennis Concepción Martín on 19/8/21.
+//
+
+import Foundation
+
+enum JsonErrors: Error {
+    case fileMissing
+    case loadFailed(cause: String)
+    case parseFailed(cause: String)
+}
--- a/Simoleon/Functions/ParseJson.swift	Thu Aug 19 19:12:31 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-//
-//  ParseJson.swift
-//  Simoleon
-//
-//  Created by Dennis Concepción Martín on 11/07/2021.
-//
-
-import Foundation
-
-
-// Read JSON File
-func parseJson<T: Decodable>(_ filename: String) -> T {
-    let data: Data
-    
-    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
-    else {
-        fatalError("Couldn't find \(filename) in main bundle.")
-    }
-    
-    do {
-        data = try Data(contentsOf: file)
-    } catch {
-        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
-    }
-    
-    do {
-        let decoder = JSONDecoder()
-        return try decoder.decode(T.self, from: data)
-    } catch {
-        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Simoleon/Functions/Read.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -0,0 +1,32 @@
+//
+//  ParseJson.swift
+//  Simoleon
+//
+//  Created by Dennis Concepción Martín on 11/07/2021.
+//
+
+import Foundation
+
+
+// Read JSON File
+func read<T: Decodable>(json filename: String) throws -> T {
+    let data: Data
+    
+    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
+    else {
+        throw JsonErrors.fileMissing
+    }
+    
+    do {
+        data = try Data(contentsOf: file)
+    } catch {
+        throw JsonErrors.loadFailed(cause: error.localizedDescription)
+    }
+    
+    do {
+        let decoder = JSONDecoder()
+        return try decoder.decode(T.self, from: data)
+    } catch {
+        throw JsonErrors.parseFailed(cause: error.localizedDescription)
+    }
+}
--- a/Simoleon/Helpers/ConversionBox.swift	Thu Aug 19 19:12:31 2021 +0100
+++ b/Simoleon/Helpers/ConversionBox.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -14,10 +14,9 @@
     @Binding var showingConversion: Bool
     @Binding var amountIsEditing: Bool
     
-    let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
-    
     var body: some View {
         VStack(alignment: .leading) {
+            let currencyMetadata: [String: CurrencyMetadataModel] = try! read(json: "CurrencyMetadata.json")
             let currencies = currencyPair.split(separator: "/")
             Text("\(currencyMetadata[String(currencies[0])]!.name) (\(String(currencies[0])))")
                 .font(.callout)
--- a/Simoleon/Helpers/CurrencyRow.swift	Thu Aug 19 19:12:31 2021 +0100
+++ b/Simoleon/Helpers/CurrencyRow.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -10,10 +10,10 @@
 struct CurrencyRow: View {
     var currencyPairName: String
     var isLocked: Bool?
-    let currencyMetadata: [String: CurrencyMetadataModel] = parseJson("CurrencyMetadata.json")
     
     var body: some View {
         HStack {
+            let currencyMetadata: [String: CurrencyMetadataModel] = try! read(json: "CurrencyMetadata.json")
             let currencies = currencyPairName.split(separator: "/")
             Image(currencyMetadata[String(currencies[0])]!.flag)
                 .resizable()
--- a/Simoleon/Helpers/CurrencySelector.swift	Thu Aug 19 19:12:31 2021 +0100
+++ b/Simoleon/Helpers/CurrencySelector.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -19,8 +19,6 @@
     @State private var alertMessage = ""
     @State private var showingAlert = false
     
-    var currencyPairs: [CurrencyPairModel] = parseJson("CurrencyPairs.json")
-    
     /*
      If searched currency string is empty:
      * Show all currencies
@@ -28,6 +26,7 @@
      * Show filtered list of currencies containing searched currency string
      */
     var searchResults: [CurrencyPairModel] {
+        let currencyPairs: [CurrencyPairModel] = try! read(json: "CurrencyPairs.json")
         if searchCurrency.isEmpty {
             return currencyPairs.sorted { !$0.isLocked && $1.isLocked }
         } else {
--- a/Simoleon/Settings.swift	Thu Aug 19 19:12:31 2021 +0100
+++ b/Simoleon/Settings.swift	Thu Aug 19 19:12:56 2021 +0100
@@ -20,8 +20,6 @@
     @State private var showingAlert = false
     @State private var searchCurrency = ""
     
-    let currencyPairs: [CurrencyPairModel] = parseJson("CurrencyPairs.json")
-    
     /*
      If searched currency string is empty:
      * Show all currencies
@@ -29,6 +27,7 @@
      * Show filtered list of currencies containing searched currency string
      */
     var searchResults: [CurrencyPairModel] {
+        let currencyPairs: [CurrencyPairModel] = try! read(json: "CurrencyPairs.json")
         if searchCurrency.isEmpty {
             return currencyPairs.sorted { $0.name < $1.name }
         } else {