gloss-ios/gloss/Line.swift

96 lines
3.0 KiB
Swift
Raw Normal View History

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 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: "")
// }
/// 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))
//}
}