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 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 /// See extension DerivableRequest { /// 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