124 lines
4.0 KiB
Swift
124 lines
4.0 KiB
Swift
|
import GRDB
|
||
|
/// The Line struct.
|
||
|
///
|
||
|
/// Identifiable conformance supports SwiftUI list animations, and type-safe
|
||
|
/// GRDB primary key methods.
|
||
|
/// Equatable conformance supports tests.
|
||
|
struct Line: Identifiable, Equatable {
|
||
|
/// The player id.
|
||
|
///
|
||
|
/// Int64 is the recommended type for auto-incremented database ids.
|
||
|
/// Use nil for players that are not inserted yet in the database.
|
||
|
var id: Int64?
|
||
|
var chap: Int
|
||
|
var verse: Int
|
||
|
var body: String
|
||
|
var book: String
|
||
|
}
|
||
|
|
||
|
extension Line {
|
||
|
private static let names = [
|
||
|
"Arthur", "Anita", "Barbara", "Bernard", "Craig", "Chiara", "David",
|
||
|
"Dean", "Éric", "Elena", "Fatima", "Frederik", "Gilbert", "Georgette",
|
||
|
"Henriette", "Hassan", "Ignacio", "Irene", "Julie", "Jack", "Karl",
|
||
|
"Kristel", "Louis", "Liz", "Masashi", "Mary", "Noam", "Nicole",
|
||
|
"Ophelie", "Oleg", "Pascal", "Patricia", "Quentin", "Quinn", "Raoul",
|
||
|
"Rachel", "Stephan", "Susie", "Tristan", "Tatiana", "Ursule", "Urbain",
|
||
|
"Victor", "Violette", "Wilfried", "Wilhelmina", "Yvon", "Yann",
|
||
|
"Zazie", "Zoé"]
|
||
|
|
||
|
|
||
|
private static let books = [
|
||
|
"John", "Matthew", "Imitation of Christ"]
|
||
|
|
||
|
/// Creates a new player with empty name and zero score
|
||
|
// static func new() -> Line {
|
||
|
// Line(id: nil, chap: 1, body: "")
|
||
|
// }
|
||
|
|
||
|
// Creates a new player with random name and random score
|
||
|
static func makeRandom() -> Line {
|
||
|
Line(id: nil, chap: randomScore(), verse: 1, body: randomName(), book: randomBook())
|
||
|
}
|
||
|
|
||
|
/// Returns a random name
|
||
|
static func randomName() -> String {
|
||
|
names.randomElement()!
|
||
|
}
|
||
|
|
||
|
/// Returns a random score
|
||
|
static func randomScore() -> Int {
|
||
|
10 * Int.random(in: 0...100)
|
||
|
}
|
||
|
|
||
|
static func randomBook() -> String {
|
||
|
books.randomElement()!
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK: - Persistence
|
||
|
|
||
|
/// Make Line a Codable Record.
|
||
|
///
|
||
|
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
|
||
|
extension Line: Codable, FetchableRecord, MutablePersistableRecord {
|
||
|
// Define database columns from CodingKeys
|
||
|
fileprivate enum Columns {
|
||
|
static let id = Column(CodingKeys.id)
|
||
|
static let chap = Column(CodingKeys.chap)
|
||
|
}
|
||
|
|
||
|
/// Updates a player id after it has been inserted in the database.
|
||
|
mutating func didInsert(_ inserted: InsertionSuccess) {
|
||
|
id = inserted.rowID
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK: - Line Database Requests
|
||
|
|
||
|
/// Define some player requests used by the application.
|
||
|
///
|
||
|
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
|
||
|
/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
|
||
|
extension DerivableRequest<Line> {
|
||
|
/// A request of players ordered by name.
|
||
|
///
|
||
|
/// For example:
|
||
|
///
|
||
|
/// let players: [Line] = try dbWriter.read { db in
|
||
|
/// try Line.all().orderedByName().fetchAll(db)
|
||
|
/// }
|
||
|
//func orderedByName() -> Self {
|
||
|
// // Sort by name in a localized case insensitive fashion
|
||
|
// // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison
|
||
|
// order(Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
|
||
|
//}
|
||
|
|
||
|
///// A request of players ordered by score.
|
||
|
/////
|
||
|
///// For example:
|
||
|
/////
|
||
|
///// let players: [Line] = try dbWriter.read { db in
|
||
|
///// try Line.all().orderedByScore().fetchAll(db)
|
||
|
///// }
|
||
|
///// let bestLine: Line? = try dbWriter.read { db in
|
||
|
///// try Line.all().orderedByScore().fetchOne(db)
|
||
|
///// }
|
||
|
//func orderedByScore() -> Self {
|
||
|
// // Sort by descending score, and then by name, in a
|
||
|
// // localized case insensitive fashion
|
||
|
// // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison
|
||
|
// order(
|
||
|
// Line.Columns.score.desc,
|
||
|
// Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
|
||
|
//}
|
||
|
}
|
||
|
//
|
||
|
// Line.swift
|
||
|
// gloss
|
||
|
//
|
||
|
// Created by Saint on 2/18/23.
|
||
|
//
|
||
|
|
||
|
import Foundation
|