Surface error_string to ObjC users

pull/16271/head
Muxi Yan 6 years ago
parent 6499836bda
commit ae013976b2
  1. 8
      src/objective-c/GRPCClient/private/GRPCWrappedCall.m
  2. 4
      src/objective-c/GRPCClient/private/NSError+GRPC.h
  3. 10
      src/objective-c/GRPCClient/private/NSError+GRPC.m

@ -187,6 +187,7 @@
grpc_slice _details;
size_t _detailsCapacity;
grpc_metadata_array _trailers;
const char *_errorString;
}
- (instancetype)init {
@ -200,6 +201,7 @@
_op.data.recv_status_on_client.status_details = &_details;
grpc_metadata_array_init(&_trailers);
_op.data.recv_status_on_client.trailing_metadata = &_trailers;
_op.data.recv_status_on_client.error_string = &_errorString;
if (handler) {
// Prevent reference cycle with _handler
__weak typeof(self) weakSelf = self;
@ -207,8 +209,9 @@
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
char *details = grpc_slice_to_c_string(strongSelf->_details);
NSError *error =
[NSError grpc_errorFromStatusCode:strongSelf->_statusCode details:details];
NSError *error = [NSError grpc_errorFromStatusCode:strongSelf->_statusCode
details:details
errorString:strongSelf->_errorString];
NSDictionary *trailers =
[NSDictionary grpc_dictionaryFromMetadataArray:strongSelf->_trailers];
handler(error, trailers);
@ -223,6 +226,7 @@
- (void)dealloc {
grpc_metadata_array_destroy(&_trailers);
grpc_slice_unref(_details);
gpr_free((void *)_errorString);
}
@end

@ -24,5 +24,7 @@
* Returns nil if the status code is OK. Otherwise, a NSError whose code is one of |GRPCErrorCode|
* and whose domain is |kGRPCErrorDomain|.
*/
+ (instancetype)grpc_errorFromStatusCode:(grpc_status_code)statusCode details:(char *)details;
+ (instancetype)grpc_errorFromStatusCode:(grpc_status_code)statusCode
details:(char *)details
errorString:(const char *)errorString;
@end

@ -23,13 +23,19 @@
NSString *const kGRPCErrorDomain = @"io.grpc";
@implementation NSError (GRPC)
+ (instancetype)grpc_errorFromStatusCode:(grpc_status_code)statusCode details:(char *)details {
+ (instancetype)grpc_errorFromStatusCode:(grpc_status_code)statusCode
details:(char *)details
errorString:(const char *)errorString {
if (statusCode == GRPC_STATUS_OK) {
return nil;
}
NSString *message = [NSString stringWithCString:details encoding:NSUTF8StringEncoding];
NSString *debugMessage = [NSString stringWithCString:errorString encoding:NSUTF8StringEncoding];
return [NSError errorWithDomain:kGRPCErrorDomain
code:statusCode
userInfo:@{NSLocalizedDescriptionKey : message}];
userInfo:@{
NSLocalizedDescriptionKey : message,
NSDebugDescriptionErrorKey : debugMessage
}];
}
@end

Loading…
Cancel
Save