44
55package dev.gitlive.firebase.functions
66
7- import cocoapods.FirebaseFunctions.*
8- import dev.gitlive.firebase.Firebase
9- import dev.gitlive.firebase.FirebaseApp
10- import dev.gitlive.firebase.FirebaseException
11- import dev.gitlive.firebase.decode
12- import dev.gitlive.firebase.encode
7+ import cocoapods.FirebaseFunctions.FIRFunctions
8+ import cocoapods.FirebaseFunctions.FIRHTTPSCallable
9+ import cocoapods.FirebaseFunctions.FIRHTTPSCallableResult
10+ import dev.gitlive.firebase.*
1311import kotlinx.coroutines.CompletableDeferred
1412import kotlinx.serialization.DeserializationStrategy
1513import kotlinx.serialization.SerializationStrategy
16- import platform.Foundation.*
14+ import platform.Foundation.NSError
1715
1816actual val Firebase .functions
1917 get() = FirebaseFunctions (FIRFunctions .functions())
@@ -58,15 +56,62 @@ actual class HttpsCallableResult constructor(val ios: FIRHTTPSCallableResult) {
5856 decode(strategy, ios.data())
5957}
6058
61- actual class FirebaseFunctionsException (message : String ): FirebaseException(message)
59+ actual class FirebaseFunctionsException (message : String , val code : FunctionsExceptionCode ) : FirebaseException(message)
60+
61+ @Suppress(" EXTENSION_SHADOWED_BY_MEMBER" )
62+ actual val FirebaseFunctionsException .code: FunctionsExceptionCode get() = code
63+
64+ actual enum class FunctionsExceptionCode {
65+ OK ,
66+ CANCELLED ,
67+ UNKNOWN ,
68+ INVALID_ARGUMENT ,
69+ DEADLINE_EXCEEDED ,
70+ NOT_FOUND ,
71+ ALREADY_EXISTS ,
72+ PERMISSION_DENIED ,
73+ RESOURCE_EXHAUSTED ,
74+ FAILED_PRECONDITION ,
75+ ABORTED ,
76+ OUT_OF_RANGE ,
77+ UNIMPLEMENTED ,
78+ INTERNAL ,
79+ UNAVAILABLE ,
80+ DATA_LOSS ,
81+ UNAUTHENTICATED
82+ }
83+ // todo uncomment once https://github.com/firebase/firebase-ios-sdk/issues/11862 fixed
84+ fun NSError.toException () = when (domain) {
85+ // FIRFunctionsErrorDomain -> when(code) {
86+ // FIRFunctionsErrorCodeOK -> FunctionsExceptionCode.OK
87+ // FIRFunctionsErrorCodeCancelled -> FunctionsExceptionCode.CANCELLED
88+ // FIRFunctionsErrorCodeUnknown -> FunctionsExceptionCode.UNKNOWN
89+ // FIRFunctionsErrorCodeInvalidArgument -> FunctionsExceptionCode.INVALID_ARGUMENT
90+ // FIRFunctionsErrorCodeDeadlineExceeded -> FunctionsExceptionCode.DEADLINE_EXCEEDED
91+ // FIRFunctionsErrorCodeNotFound -> FunctionsExceptionCode.NOT_FOUND
92+ // FIRFunctionsErrorCodeAlreadyExists -> FunctionsExceptionCode.ALREADY_EXISTS
93+ // FIRFunctionsErrorCodePermissionDenied -> FunctionsExceptionCode.PERMISSION_DENIED
94+ // FIRFunctionsErrorCodeResourceExhausted -> FunctionsExceptionCode.RESOURCE_EXHAUSTED
95+ // FIRFunctionsErrorCodeFailedPrecondition -> FunctionsExceptionCode.FAILED_PRECONDITION
96+ // FIRFunctionsErrorCodeAborted -> FunctionsExceptionCode.ABORTED
97+ // FIRFunctionsErrorCodeOutOfRange -> FunctionsExceptionCode.OUT_OF_RANGE
98+ // FIRFunctionsErrorCodeUnimplemented -> FunctionsExceptionCode.UNIMPLEMENTED
99+ // FIRFunctionsErrorCodeInternal -> FunctionsExceptionCode.INTERNAL
100+ // FIRFunctionsErrorCodeUnavailable -> FunctionsExceptionCode.UNAVAILABLE
101+ // FIRFunctionsErrorCodeDataLoss -> FunctionsExceptionCode.DATA_LOSS
102+ // FIRFunctionsErrorCodeUnauthenticated -> FunctionsExceptionCode.UNAUTHENTICATED
103+ // else -> FunctionsExceptionCode.UNKNOWN
104+ // }
105+ else -> FunctionsExceptionCode .UNKNOWN
106+ }.let { FirebaseFunctionsException (description!! , it) }
62107
63108suspend inline fun <T > T.await (function : T .(callback: (NSError ? ) -> Unit ) -> Unit ) {
64109 val job = CompletableDeferred <Unit >()
65110 function { error ->
66111 if (error == null ) {
67112 job.complete(Unit )
68113 } else {
69- job.completeExceptionally(FirebaseFunctionsException ( error.localizedDescription ))
114+ job.completeExceptionally(error.toException( ))
70115 }
71116 }
72117 job.await()
@@ -78,7 +123,7 @@ suspend inline fun <T, reified R> T.awaitResult(function: T.(callback: (R?, NSEr
78123 if (error == null ) {
79124 job.complete(result)
80125 } else {
81- job.completeExceptionally(FirebaseFunctionsException ( error.localizedDescription ))
126+ job.completeExceptionally(error.toException( ))
82127 }
83128 }
84129 return job.await() as R
0 commit comments