🧑‍💻 🔥 Decouple Data/UnitsStore

pull/8/head
Alexis Drai 2 years ago
parent 0858bd0a90
commit ce61496b5b

@ -117,7 +117,6 @@
EC8BAD142A34650D0062226B /* Data */ = { EC8BAD142A34650D0062226B /* Data */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
EC242B822A1FAA9B006FE760 /* Stub.swift */,
EC8BAD152A3465230062226B /* UnitsStore.swift */, EC8BAD152A3465230062226B /* UnitsStore.swift */,
); );
path = Data; path = Data;
@ -184,6 +183,7 @@
ECE6E3C02A1F80F6004FE471 /* Model */ = { ECE6E3C02A1F80F6004FE471 /* Model */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
EC242B822A1FAA9B006FE760 /* Stub.swift */,
EC242B6B2A1F81AE006FE760 /* Subject.swift */, EC242B6B2A1F81AE006FE760 /* Subject.swift */,
EC242B692A1F8189006FE760 /* Unit.swift */, EC242B692A1F8189006FE760 /* Unit.swift */,
EC242B6D2A1F81CC006FE760 /* UnitsManager.swift */, EC242B6D2A1F81CC006FE760 /* UnitsManager.swift */,

@ -9,41 +9,35 @@ import SwiftUI
class UnitsStore: ObservableObject { class UnitsStore: ObservableObject {
var units: [Unit] = []
private static func fileURL() throws -> URL { private static func fileURL() throws -> URL {
try FileManager.default.url( try FileManager.default.url(
for: .documentDirectory, for: .documentDirectory,
in: .userDomainMask, in: .userDomainMask,
appropriateFor: nil, appropriateFor: nil,
create: false create: false
).appendingPathComponent("units.data") ).appendingPathComponent("my.data")
} }
func load() async throws -> [Unit] { func load<T: Codable>(defaultValue: [T]) async throws -> [T] {
let task = Task<[Unit], Error> { let task = Task<[T], Error> {
let fileURL = try Self.fileURL() let fileURL = try Self.fileURL()
let data = try? Data(contentsOf: fileURL) let data = try? Data(contentsOf: fileURL)
var units: [Unit] = [] var elements: [T] = defaultValue
if (data == nil || data!.isEmpty) { if let validData = data, !validData.isEmpty {
units = Stub.units elements = try JSONDecoder().decode([T].self, from: validData)
}
else if (data != nil) {
units = try JSONDecoder().decode([Unit].self, from: data!)
} }
return units return elements
} }
self.units = try await task.value return try await task.value
return self.units
} }
func save(units: [Unit]) async throws { func save<T: Codable>(elements: [T]) async throws {
let task = Task { let task = Task {
let data = try JSONEncoder().encode(units) let data = try JSONEncoder().encode(elements)
let outfile = try Self.fileURL() let outfile = try Self.fileURL()
try data.write(to: outfile) try data.write(to: outfile)
} }

@ -19,7 +19,7 @@ struct UnitsManager {
mutating func load() async throws { mutating func load() async throws {
do { do {
self.units = try await store.load() self.units = try await store.load(defaultValue: Stub.units)
} catch { } catch {
// DEV: this should be replaced with proper error handling before ever going to prod // DEV: this should be replaced with proper error handling before ever going to prod
print("ERROR: Failed to load...") print("ERROR: Failed to load...")
@ -28,7 +28,7 @@ struct UnitsManager {
func save() async throws { func save() async throws {
do { do {
try await store.save(units: units) try await store.save(elements: units)
} catch { } catch {
// DEV: this should be replaced with proper error handling before ever going to prod // DEV: this should be replaced with proper error handling before ever going to prod
print("ERROR: Failed to save...") print("ERROR: Failed to save...")

Loading…
Cancel
Save