diff --git a/Graduator/Graduator.xcodeproj/project.pbxproj b/Graduator/Graduator.xcodeproj/project.pbxproj index 2041f39..4ab0d6c 100644 --- a/Graduator/Graduator.xcodeproj/project.pbxproj +++ b/Graduator/Graduator.xcodeproj/project.pbxproj @@ -117,7 +117,6 @@ EC8BAD142A34650D0062226B /* Data */ = { isa = PBXGroup; children = ( - EC242B822A1FAA9B006FE760 /* Stub.swift */, EC8BAD152A3465230062226B /* UnitsStore.swift */, ); path = Data; @@ -184,6 +183,7 @@ ECE6E3C02A1F80F6004FE471 /* Model */ = { isa = PBXGroup; children = ( + EC242B822A1FAA9B006FE760 /* Stub.swift */, EC242B6B2A1F81AE006FE760 /* Subject.swift */, EC242B692A1F8189006FE760 /* Unit.swift */, EC242B6D2A1F81CC006FE760 /* UnitsManager.swift */, diff --git a/Graduator/Graduator/Data/UnitsStore.swift b/Graduator/Graduator/Data/UnitsStore.swift index 947cb33..045b439 100644 --- a/Graduator/Graduator/Data/UnitsStore.swift +++ b/Graduator/Graduator/Data/UnitsStore.swift @@ -9,41 +9,35 @@ import SwiftUI class UnitsStore: ObservableObject { - - var units: [Unit] = [] - + private static func fileURL() throws -> URL { try FileManager.default.url( for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false - ).appendingPathComponent("units.data") + ).appendingPathComponent("my.data") } - func load() async throws -> [Unit] { - - let task = Task<[Unit], Error> { + func load(defaultValue: [T]) async throws -> [T] { + + let task = Task<[T], Error> { let fileURL = try Self.fileURL() let data = try? Data(contentsOf: fileURL) - var units: [Unit] = [] - if (data == nil || data!.isEmpty) { - units = Stub.units - } - else if (data != nil) { - units = try JSONDecoder().decode([Unit].self, from: data!) + var elements: [T] = defaultValue + if let validData = data, !validData.isEmpty { + elements = try JSONDecoder().decode([T].self, from: validData) } - return units + return elements } - self.units = try await task.value - return self.units + return try await task.value } - func save(units: [Unit]) async throws { + func save(elements: [T]) async throws { let task = Task { - let data = try JSONEncoder().encode(units) + let data = try JSONEncoder().encode(elements) let outfile = try Self.fileURL() try data.write(to: outfile) } diff --git a/Graduator/Graduator/Data/Stub.swift b/Graduator/Graduator/Model/Stub.swift similarity index 100% rename from Graduator/Graduator/Data/Stub.swift rename to Graduator/Graduator/Model/Stub.swift diff --git a/Graduator/Graduator/Model/UnitsManager.swift b/Graduator/Graduator/Model/UnitsManager.swift index fe2876f..a232324 100644 --- a/Graduator/Graduator/Model/UnitsManager.swift +++ b/Graduator/Graduator/Model/UnitsManager.swift @@ -19,7 +19,7 @@ struct UnitsManager { mutating func load() async throws { do { - self.units = try await store.load() + self.units = try await store.load(defaultValue: Stub.units) } catch { // DEV: this should be replaced with proper error handling before ever going to prod print("ERROR: Failed to load...") @@ -28,7 +28,7 @@ struct UnitsManager { func save() async throws { do { - try await store.save(units: units) + try await store.save(elements: units) } catch { // DEV: this should be replaced with proper error handling before ever going to prod print("ERROR: Failed to save...")