Basic Setup of Classes and First Load/ Store Methods

This commit is contained in:
severin.memmishofer
2023-07-09 11:12:27 +02:00
parent b24bfca630
commit 51e1215ddf
5 changed files with 126 additions and 0 deletions

19
RippleChat/Body.swift Normal file
View File

@@ -0,0 +1,19 @@
//
// Body.swift
// RippleChat
//
// Created by Severin Memmishofer on 08.07.23.
//
import Foundation
struct Body: Codable {
let tag: String
let value: String
init(tag: String, value: String) {
self.tag = tag
self.value = value
}
}

25
RippleChat/Feed.swift Normal file
View File

@@ -0,0 +1,25 @@
//
// Feed.swift
// RippleChat
//
// Created by Severin Memmishofer on 08.07.23.
//
import Foundation
struct Feed: Codable {
let feed: [LogEntry]
}
extension Feed {
static let sampleData: [LogEntry] =
[
LogEntry(feedid: "BOB", sequenceNumber: 1, body: Body(tag: "nam", value: "Bob")),
LogEntry(feedid: "BOB", sequenceNumber: 2, body: Body(tag: "txt", value: "My first post!")),
LogEntry(feedid: "BOB", sequenceNumber: 3, body: Body(tag: "txt", value: "Welcome Alice"))
]
}

View File

@@ -0,0 +1,44 @@
//
// FeedStore.swift
// RippleChat
//
// Created by Severin Memmishofer on 08.07.23.
//
import SwiftUI
@MainActor
class FeedStore: ObservableObject {
@Published var feed: [LogEntry] = []
private static func fileURL() throws -> URL {
try FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false)
.appendingPathComponent("feed.data")
}
func load() async throws {
let task = Task<[LogEntry], Error> {
let fileURL = try Self.fileURL()
guard let data = try? Data(contentsOf: fileURL) else {
return []
}
let logEntries = try JSONDecoder().decode([LogEntry].self, from: data)
return logEntries
}
let feed = try await task.value
self.feed = feed
}
func save(feed: [LogEntry]) async throws {
let task = Task {
let data = try JSONEncoder().encode(feed)
let outfile = try Self.fileURL()
try data.write(to: outfile)
}
_ = try await task.value
}
}

22
RippleChat/LogEntry.swift Normal file
View File

@@ -0,0 +1,22 @@
//
// LogEntry.swift
// RippleChat
//
// Created by Severin Memmishofer on 08.07.23.
//
import Foundation
struct LogEntry: Codable {
let feedid: String
let sequenceNumber: Int
let body: Body
init(feedid: String, sequenceNumber: Int, body: Body) {
self.feedid = feedid
self.sequenceNumber = sequenceNumber
self.body = body
}
}