Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Require explicit typing for DocumentSnapshot decoding. DocumentReference decoding. #9101

Merged
Prev Previous commit
Next Next commit
Updated doc comments. Added async version of getDocument(as:)
  • Loading branch information
mortenbekditlevsen committed Dec 15, 2021
commit 7815580aff7a4004e9c2175813a066eee3481479
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,25 @@ import Foundation
import FirebaseFirestore

extension DocumentReference {
/// Encodes an instance of `Encodable` and overwrites the encoded data
/// to the document referred by this `DocumentReference`. If no document exists,
/// it is created. If a document already exists, it is overwritten.
///
/// See `Firestore.Encoder` for more details about the encoding process.
/// Fetches and decodes the document referenced by this `DocumentReference`.
///
/// This allows users to retrieve a Firestore document and have it decoded to an instance of
/// caller-specified type.
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
/// ```swift
/// ref.getDocument(as: Book.self) { result in
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
/// do {
/// let book = try result.get()
/// } catch {
/// // Handle error
/// }
/// }
/// ```
/// - Parameters:
/// - value: An instance of `Encodable` to be encoded to a document.
/// - encoder: An encoder instance to use to run the encoding.
/// - completion: A block to execute once the document has been successfully
/// written to the server. This block will not be called while
/// the client is offline, though local changes will be visible
/// immediately.

/// - as: A `Decodable` type to convert the document fields to.
/// - serverTimestampBehavior: Configures how server timestamps that have
/// not yet been set to their final value are returned from the snapshot.
/// - decoder: The decoder to use to convert the document. `nil` to use
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
/// - completion: The closure to call when the document snapshot has been fetched and decoded.
public func getDocument<T: Decodable>(as type: T.Type,
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
with serverTimestampBehavior: ServerTimestampBehavior =
.none,
Expand All @@ -50,4 +55,31 @@ extension DocumentReference {
completion(result)
}
}

// TODO: How do you annotate that using Xcode 13.2 you can actually compile to earlier os versions
#if compiler(>=5.5) && canImport(_Concurrency)
/// Fetches and decodes the document referenced by this `DocumentReference`.
///
/// This allows users to retrieve a Firestore document and have it decoded to an instance of
/// caller-specified type.
/// ```swift
/// let book = try await ref.getDocument(as: Book.self)
/// ```
/// - Parameters:
/// - as: A `Decodable` type to convert the document fields to.
/// - serverTimestampBehavior: Configures how server timestamps that have
/// not yet been set to their final value are returned from the snapshot.
/// - decoder: The decoder to use to convert the document. `nil` to use
/// - Returns: This instance of the supplied `Decodable` type `T`.
@available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
public func getDocument<T: Decodable>(as type: T.Type,
with serverTimestampBehavior: ServerTimestampBehavior =
.none,
decoder: Firestore.Decoder? = nil) async throws -> T {
let snapshot = try await getDocument()
return try snapshot.data(as: T.self,
with: serverTimestampBehavior,
decoder: decoder)
}
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ extension DocumentReference {
/// - Parameters:
/// - value: An instance of `Encodable` to be encoded to a document.
/// - encoder: An encoder instance to use to run the encoding.
/// - completion: A block to execute once the document has been successfully
/// - completion: A closure to execute once the document has been successfully
/// written to the server. This block will not be called while
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
/// the client is offline, though local changes will be visible
/// immediately.
Expand All @@ -49,7 +49,7 @@ extension DocumentReference {
/// - merge: Whether to merge the provided `Encodable` into any existing
/// document.
/// - encoder: An encoder instance to use to run the encoding.
/// - completion: A block to execute once the document has been successfully
/// - completion: A closure to execute once the document has been successfully
/// written to the server. This block will not be called while
/// the client is offline, though local changes will be visible
/// immediately.
Expand All @@ -76,7 +76,7 @@ extension DocumentReference {
/// merge. Fields can contain dots to reference nested fields within the
/// document.
/// - encoder: An encoder instance to use to run the encoding.
/// - completion: A block to execute once the document has been successfully
/// - completion: A closure to execute once the document has been successfully
/// written to the server. This block will not be called while
/// the client is offline, though local changes will be visible
/// immediately.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import FirebaseFirestore

extension DocumentSnapshot {
/// Retrieves all fields in a document and converts them to an instance of
/// caller-specified type. Returns `nil` if the document does not exist.
/// caller-specified type.
///
/// By default, server-provided timestamps that have not yet been set to their
/// final value will be returned as `NSNull`. Pass `serverTimestampBehavior`
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
Expand Down