Skip to content

Commit 5ab7bfb

Browse files
committed
recordNotFound returns an error instead of Never
https://forums.swift.org/t/methods-that-throw-and-return-never/61715
1 parent 520766a commit 5ab7bfb

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

GRDB/Record/FetchableRecord+TableRecord.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ extension FetchableRecord where Self: TableRecord {
211211
/// does not exist in the database.
212212
public static func find(_ db: Database, key: some DatabaseValueConvertible) throws -> Self {
213213
guard let record = try fetchOne(db, key: key) else {
214-
try recordNotFound(db, key: key)
214+
throw recordNotFound(db, key: key)
215215
}
216216
return record
217217
}
@@ -502,7 +502,7 @@ extension FetchableRecord where Self: TableRecord {
502502
/// does not exist in the database.
503503
public static func find(_ db: Database, key: [String: (any DatabaseValueConvertible)?]) throws -> Self {
504504
guard let record = try filter(key: key).fetchOne(db) else {
505-
try recordNotFound(key: key)
505+
throw recordNotFound(key: key)
506506
}
507507
return record
508508
}

GRDB/Record/TableRecord.swift

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -680,27 +680,40 @@ extension RecordError: CustomStringConvertible {
680680
}
681681

682682
extension TableRecord {
683-
/// Throws a `RecordError.recordNotFound` error.
684-
public static func recordNotFound(_ db: Database, key: some DatabaseValueConvertible) throws -> Never {
685-
let primaryKey = try db.primaryKey(databaseTableName)
686-
throw RecordError.recordNotFound(
687-
databaseTableName: databaseTableName,
688-
key: [primaryKey.columns[0]: key.databaseValue])
683+
/// Returns an error for a record that does not exist in the database.
684+
///
685+
/// - returns: ``RecordError/recordNotFound(databaseTableName:key:)``, or
686+
/// any error that prevented the `RecordError` from being constructed.
687+
public static func recordNotFound(_ db: Database, key: some DatabaseValueConvertible) -> any Error {
688+
do {
689+
let primaryKey = try db.primaryKey(databaseTableName)
690+
GRDBPrecondition(
691+
primaryKey.columns.count == 1,
692+
"Requesting by key requires a single-column primary key in the table \(databaseTableName)")
693+
return RecordError.recordNotFound(
694+
databaseTableName: databaseTableName,
695+
key: [primaryKey.columns[0]: key.databaseValue])
696+
} catch {
697+
return error
698+
}
689699
}
690700

691-
/// Throws a `RecordError.recordNotFound` error.
692-
public static func recordNotFound(key: [String: (any DatabaseValueConvertible)?]) throws -> Never {
693-
throw RecordError.recordNotFound(
701+
/// Returns an error for a record that does not exist in the database.
702+
public static func recordNotFound(key: [String: (any DatabaseValueConvertible)?]) -> RecordError {
703+
return RecordError.recordNotFound(
694704
databaseTableName: databaseTableName,
695705
key: key.mapValues { $0?.databaseValue ?? .null })
696706
}
697707
}
698708

699709
@available(OSX 10.15, iOS 13.0, tvOS 13.0, watchOS 6, *)
700710
extension TableRecord where Self: Identifiable, ID: DatabaseValueConvertible {
701-
/// Throws a `RecordError.recordNotFound` error.
702-
public static func recordNotFound(_ db: Database, id: Self.ID) throws -> Never {
703-
try recordNotFound(db, key: id)
711+
/// Returns an error for a record that does not exist in the database.
712+
///
713+
/// - returns: ``RecordError/recordNotFound(databaseTableName:key:)``, or
714+
/// any error that prevented the `RecordError` from being constructed.
715+
public static func recordNotFound(_ db: Database, id: Self.ID) -> any Error {
716+
return recordNotFound(db, key: id)
704717
}
705718
}
706719

0 commit comments

Comments
 (0)