4
4
5
5
package dev.gitlive.firebase.functions
6
6
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.*
13
11
import kotlinx.coroutines.CompletableDeferred
14
12
import kotlinx.serialization.DeserializationStrategy
15
13
import kotlinx.serialization.SerializationStrategy
16
- import platform.Foundation.*
14
+ import platform.Foundation.NSError
17
15
18
16
actual val Firebase .functions
19
17
get() = FirebaseFunctions (FIRFunctions .functions())
@@ -58,15 +56,62 @@ actual class HttpsCallableResult constructor(val ios: FIRHTTPSCallableResult) {
58
56
decode(strategy, ios.data())
59
57
}
60
58
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) }
62
107
63
108
suspend inline fun <T > T.await (function : T .(callback: (NSError ? ) -> Unit ) -> Unit ) {
64
109
val job = CompletableDeferred <Unit >()
65
110
function { error ->
66
111
if (error == null ) {
67
112
job.complete(Unit )
68
113
} else {
69
- job.completeExceptionally(FirebaseFunctionsException ( error.localizedDescription ))
114
+ job.completeExceptionally(error.toException( ))
70
115
}
71
116
}
72
117
job.await()
@@ -78,7 +123,7 @@ suspend inline fun <T, reified R> T.awaitResult(function: T.(callback: (R?, NSEr
78
123
if (error == null ) {
79
124
job.complete(result)
80
125
} else {
81
- job.completeExceptionally(FirebaseFunctionsException ( error.localizedDescription ))
126
+ job.completeExceptionally(error.toException( ))
82
127
}
83
128
}
84
129
return job.await() as R
0 commit comments