gloss-ios/RibbonRequest.swift

91 lines
2.6 KiB
Swift
Raw Normal View History

import Combine
import GRDB
import GRDBQuery
/// A player request can be used with the `@Query` property wrapper in order to
/// feed a view with a list of players.
///
/// For example:
///
/// struct MyView: View {
/// @Query(RibbonRequest(ordering: .byName)) private var players: [Ribbon]
///
/// var body: some View {
/// List(players) { player in ... )
/// }
/// }
2023-02-28 14:03:58 -08:00
var idColumn = Column("id")
struct RibbonRequest: Queryable {
// enum Ordering {
// case byScore
// case byName
// }
/// The ordering used by the player request.
// var ordering: Ordering
2023-02-28 14:03:58 -08:00
var id: Int64!
// MARK: - Queryable Implementation
static var defaultValue: [Ribbon] { [] }
func publisher(in appDatabase: AppDatabase) -> AnyPublisher<[Ribbon], Error> {
// Build the publisher from the general-purpose read-only access
// granted by `appDatabase.reader`.
// Some apps will prefer to call a dedicated method of `appDatabase`.
ValueObservation
.tracking(fetchValue(_:))
.publisher(
in: appDatabase.reader,
// The `.immediate` scheduling feeds the view right on
// subscription, and avoids an undesired animation when the
// application starts.
scheduling: .immediate)
.eraseToAnyPublisher()
}
// This method is not required by Queryable, but it makes it easier
func fetchValue(_ db: Database) throws -> [Ribbon] {
var sql = """
select distinct r1.* from Ribbon r1 join Ribbon r2 ON \
r1.undoLevel = r2.currentLevel AND r1.id = r2.id
"""
do {
var ret = try Ribbon.fetchAll(db, sql: sql)
print("xxxxx fetching ribbons")
print(ret)
return ret
} catch {
print(error.localizedDescription)
print(error)
print("Error")
return []
}
if id == nil {
return try Ribbon.order(Column("pos")).fetchAll(db)
2023-02-28 14:03:58 -08:00
} else {
return try Ribbon.filter(idColumn == id).fetchAll(db)
}
// if book == "" {
// return try Ribbon.filter(bookColumn == Ribbon.randomBook()).fetchAll(db)
// } else {
// return try Ribbon.filter(bookColumn == book).fetchAll(db)
// }
// switch ordering {
// case .byScore:
// return try Ribbon.all().fetchAll(db)
// case .byName:
// // return try Ribbon.all().orderedByName().fetchAll(db)
// return try Ribbon.all().fetchAll(db)
// }
}
}