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
1 change: 1 addition & 0 deletions Firestore/Swift/Source/Codable/CodableErrors.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
public enum FirestoreDecodingError: Error {
case decodingIsNotSupported(String)
case fieldNameConflict(String)
case `internal`
}

public enum FirestoreEncodingError: Error {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright 2021 Google
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import Foundation
import FirebaseFirestore

extension DocumentReference {
/// Encodes an instance of `Encodable` and overwrites the encoded data
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
/// 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.
///
/// - 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
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
/// written to the server. This block will not be called while
/// the client is offline, though local changes will be visible
/// immediately.

mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
public func getDocument<T: Decodable>(as type: T.Type,
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
with serverTimestampBehavior: ServerTimestampBehavior =
.none,
decoder: Firestore.Decoder? = nil,
completion: @escaping (Result<T, Error>) -> Void) {
getDocument { snapshot, error in
guard let snapshot = snapshot else {
completion(.failure(error ?? FirestoreDecodingError.internal))
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
return
}
let result = Result {
try snapshot.data(as: T.self,
with: serverTimestampBehavior,
decoder: decoder)
}
completion(result)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,9 @@ extension DocumentSnapshot {
/// default decoder.
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
public func data<T: Decodable>(as type: T.Type,
with serverTimestampBehavior: ServerTimestampBehavior = .none,
decoder: Firestore.Decoder? = nil) throws -> T? {
decoder: Firestore.Decoder? = nil) throws -> T {
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
let d = decoder ?? Firestore.Decoder()
if let data = data(with: serverTimestampBehavior) {
return try d.decode(T.self, from: data, in: reference)
}
return nil
let data: Any = data(with: serverTimestampBehavior) ?? NSNull()
mortenbekditlevsen marked this conversation as resolved.
Show resolved Hide resolved
return try d.decode(T.self, from: data, in: reference)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ extension Firestore {
/// decoded.
/// - Returns: An instance of specified type by the first parameter.
public func decode<T: Decodable>(_: T.Type,
from container: [String: Any],
from container: Any,
in document: DocumentReference? = nil) throws -> T {
let decoder = _FirestoreDecoder(referencing: container)
if let doc = document {
Expand Down