// // Copyright 2010-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"). // You may not use this file except in compliance with the License. // A copy of the License is located at // // http://aws.amazon.com/apache2.0 // // or in the "license" file accompanying this file. This file 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 "AWSTranslateService.h" #import #import #import #import #import #import #import #import #import "AWSTranslateResources.h" static NSString *const AWSInfoTranslate = @"Translate"; NSString *const AWSTranslateSDKVersion = @"2.33.3"; @interface AWSTranslateResponseSerializer : AWSJSONResponseSerializer @end @implementation AWSTranslateResponseSerializer #pragma mark - Service errors static NSDictionary *errorCodeDictionary = nil; + (void)initialize { errorCodeDictionary = @{ @"ConcurrentModificationException" : @(AWSTranslateErrorConcurrentModification), @"ConflictException" : @(AWSTranslateErrorConflict), @"DetectedLanguageLowConfidenceException" : @(AWSTranslateErrorDetectedLanguageLowConfidence), @"InternalServerException" : @(AWSTranslateErrorInternalServer), @"InvalidFilterException" : @(AWSTranslateErrorInvalidFilter), @"InvalidParameterValueException" : @(AWSTranslateErrorInvalidParameterValue), @"InvalidRequestException" : @(AWSTranslateErrorInvalidRequest), @"LimitExceededException" : @(AWSTranslateErrorLimitExceeded), @"ResourceNotFoundException" : @(AWSTranslateErrorResourceNotFound), @"ServiceUnavailableException" : @(AWSTranslateErrorServiceUnavailable), @"TextSizeLimitExceededException" : @(AWSTranslateErrorTextSizeLimitExceeded), @"TooManyRequestsException" : @(AWSTranslateErrorTooManyRequests), @"TooManyTagsException" : @(AWSTranslateErrorTooManyTags), @"UnsupportedDisplayLanguageCodeException" : @(AWSTranslateErrorUnsupportedDisplayLanguageCode), @"UnsupportedLanguagePairException" : @(AWSTranslateErrorUnsupportedLanguagePair), }; } #pragma mark - - (id)responseObjectForResponse:(NSHTTPURLResponse *)response originalRequest:(NSURLRequest *)originalRequest currentRequest:(NSURLRequest *)currentRequest data:(id)data error:(NSError *__autoreleasing *)error { id responseObject = [super responseObjectForResponse:response originalRequest:originalRequest currentRequest:currentRequest data:data error:error]; if (!*error && [responseObject isKindOfClass:[NSDictionary class]]) { if (!*error && [responseObject isKindOfClass:[NSDictionary class]]) { if ([errorCodeDictionary objectForKey:[[[responseObject objectForKey:@"__type"] componentsSeparatedByString:@"#"] lastObject]]) { if (error) { *error = [NSError errorWithDomain:AWSTranslateErrorDomain code:[[errorCodeDictionary objectForKey:[[[responseObject objectForKey:@"__type"] componentsSeparatedByString:@"#"] lastObject]] integerValue] userInfo:responseObject]; } return responseObject; } else if ([[[responseObject objectForKey:@"__type"] componentsSeparatedByString:@"#"] lastObject]) { if (error) { *error = [NSError errorWithDomain:AWSCognitoIdentityErrorDomain code:AWSCognitoIdentityErrorUnknown userInfo:responseObject]; } return responseObject; } } } if (!*error && response.statusCode/100 != 2) { *error = [NSError errorWithDomain:AWSTranslateErrorDomain code:AWSTranslateErrorUnknown userInfo:nil]; } if (!*error && [responseObject isKindOfClass:[NSDictionary class]]) { if (self.outputClass) { responseObject = [AWSMTLJSONAdapter modelOfClass:self.outputClass fromJSONDictionary:responseObject error:error]; } } return responseObject; } @end @interface AWSTranslateRequestRetryHandler : AWSURLRequestRetryHandler @end @implementation AWSTranslateRequestRetryHandler @end @interface AWSRequest() @property (nonatomic, strong) AWSNetworkingRequest *internalRequest; @end @interface AWSTranslate() @property (nonatomic, strong) AWSNetworking *networking; @property (nonatomic, strong) AWSServiceConfiguration *configuration; @end @interface AWSServiceConfiguration() @property (nonatomic, strong) AWSEndpoint *endpoint; @end @interface AWSEndpoint() - (void) setRegion:(AWSRegionType)regionType service:(AWSServiceType)serviceType; @end @implementation AWSTranslate + (void)initialize { [super initialize]; if (![AWSiOSSDKVersion isEqualToString:AWSTranslateSDKVersion]) { @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"AWSCore and AWSTranslate versions need to match. Check your SDK installation. AWSCore: %@ AWSTranslate: %@", AWSiOSSDKVersion, AWSTranslateSDKVersion] userInfo:nil]; } } #pragma mark - Setup static AWSSynchronizedMutableDictionary *_serviceClients = nil; + (instancetype)defaultTranslate { static AWSTranslate *_defaultTranslate = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ AWSServiceConfiguration *serviceConfiguration = nil; AWSServiceInfo *serviceInfo = [[AWSInfo defaultAWSInfo] defaultServiceInfo:AWSInfoTranslate]; if (serviceInfo) { serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:serviceInfo.region credentialsProvider:serviceInfo.cognitoCredentialsProvider]; } if (!serviceConfiguration) { serviceConfiguration = [AWSServiceManager defaultServiceManager].defaultServiceConfiguration; } if (!serviceConfiguration) { @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"The service configuration is `nil`. You need to configure `awsconfiguration.json`, `Info.plist` or set `defaultServiceConfiguration` before using this method." userInfo:nil]; } _defaultTranslate = [[AWSTranslate alloc] initWithConfiguration:serviceConfiguration]; }); return _defaultTranslate; } + (void)registerTranslateWithConfiguration:(AWSServiceConfiguration *)configuration forKey:(NSString *)key { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _serviceClients = [AWSSynchronizedMutableDictionary new]; }); [_serviceClients setObject:[[AWSTranslate alloc] initWithConfiguration:configuration] forKey:key]; } + (instancetype)TranslateForKey:(NSString *)key { @synchronized(self) { AWSTranslate *serviceClient = [_serviceClients objectForKey:key]; if (serviceClient) { return serviceClient; } AWSServiceInfo *serviceInfo = [[AWSInfo defaultAWSInfo] serviceInfo:AWSInfoTranslate forKey:key]; if (serviceInfo) { AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:serviceInfo.region credentialsProvider:serviceInfo.cognitoCredentialsProvider]; [AWSTranslate registerTranslateWithConfiguration:serviceConfiguration forKey:key]; } return [_serviceClients objectForKey:key]; } } + (void)removeTranslateForKey:(NSString *)key { [_serviceClients removeObjectForKey:key]; } - (instancetype)init { @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"`- init` is not a valid initializer. Use `+ defaultTranslate` or `+ TranslateForKey:` instead." userInfo:nil]; return nil; } #pragma mark - - (instancetype)initWithConfiguration:(AWSServiceConfiguration *)configuration { if (self = [super init]) { _configuration = [configuration copy]; if(!configuration.endpoint){ _configuration.endpoint = [[AWSEndpoint alloc] initWithRegion:_configuration.regionType service:AWSServiceTranslate useUnsafeURL:NO]; }else{ [_configuration.endpoint setRegion:_configuration.regionType service:AWSServiceTranslate]; } AWSSignatureV4Signer *signer = [[AWSSignatureV4Signer alloc] initWithCredentialsProvider:_configuration.credentialsProvider endpoint:_configuration.endpoint]; AWSNetworkingRequestInterceptor *baseInterceptor = [[AWSNetworkingRequestInterceptor alloc] initWithUserAgent:_configuration.userAgent]; _configuration.requestInterceptors = @[baseInterceptor, signer]; _configuration.baseURL = _configuration.endpoint.URL; _configuration.retryHandler = [[AWSTranslateRequestRetryHandler alloc] initWithMaximumRetryCount:_configuration.maxRetryCount]; _configuration.headers = @{@"Content-Type" : @"application/x-amz-json-1.1"}; _networking = [[AWSNetworking alloc] initWithConfiguration:_configuration]; } return self; } - (AWSTask *)invokeRequest:(AWSRequest *)request HTTPMethod:(AWSHTTPMethod)HTTPMethod URLString:(NSString *) URLString targetPrefix:(NSString *)targetPrefix operationName:(NSString *)operationName outputClass:(Class)outputClass { @autoreleasepool { if (!request) { request = [AWSRequest new]; } AWSNetworkingRequest *networkingRequest = request.internalRequest; if (request) { networkingRequest.parameters = [[AWSMTLJSONAdapter JSONDictionaryFromModel:request] aws_removeNullValues]; } else { networkingRequest.parameters = @{}; } NSMutableDictionary *headers = [NSMutableDictionary new]; headers[@"X-Amz-Target"] = [NSString stringWithFormat:@"%@.%@", targetPrefix, operationName]; networkingRequest.headers = headers; networkingRequest.HTTPMethod = HTTPMethod; networkingRequest.requestSerializer = [[AWSJSONRequestSerializer alloc] initWithJSONDefinition:[[AWSTranslateResources sharedInstance] JSONObject] actionName:operationName]; networkingRequest.responseSerializer = [[AWSTranslateResponseSerializer alloc] initWithJSONDefinition:[[AWSTranslateResources sharedInstance] JSONObject] actionName:operationName outputClass:outputClass]; return [self.networking sendRequest:networkingRequest]; } } #pragma mark - Service method - (AWSTask *)createParallelData:(AWSTranslateCreateParallelDataRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"CreateParallelData" outputClass:[AWSTranslateCreateParallelDataResponse class]]; } - (void)createParallelData:(AWSTranslateCreateParallelDataRequest *)request completionHandler:(void (^)(AWSTranslateCreateParallelDataResponse *response, NSError *error))completionHandler { [[self createParallelData:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateCreateParallelDataResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)deleteParallelData:(AWSTranslateDeleteParallelDataRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"DeleteParallelData" outputClass:[AWSTranslateDeleteParallelDataResponse class]]; } - (void)deleteParallelData:(AWSTranslateDeleteParallelDataRequest *)request completionHandler:(void (^)(AWSTranslateDeleteParallelDataResponse *response, NSError *error))completionHandler { [[self deleteParallelData:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateDeleteParallelDataResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)deleteTerminology:(AWSTranslateDeleteTerminologyRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"DeleteTerminology" outputClass:nil]; } - (void)deleteTerminology:(AWSTranslateDeleteTerminologyRequest *)request completionHandler:(void (^)(NSError *error))completionHandler { [[self deleteTerminology:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { NSError *error = task.error; if (completionHandler) { completionHandler(error); } return nil; }]; } - (AWSTask *)describeTextTranslationJob:(AWSTranslateDescribeTextTranslationJobRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"DescribeTextTranslationJob" outputClass:[AWSTranslateDescribeTextTranslationJobResponse class]]; } - (void)describeTextTranslationJob:(AWSTranslateDescribeTextTranslationJobRequest *)request completionHandler:(void (^)(AWSTranslateDescribeTextTranslationJobResponse *response, NSError *error))completionHandler { [[self describeTextTranslationJob:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateDescribeTextTranslationJobResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)getParallelData:(AWSTranslateGetParallelDataRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"GetParallelData" outputClass:[AWSTranslateGetParallelDataResponse class]]; } - (void)getParallelData:(AWSTranslateGetParallelDataRequest *)request completionHandler:(void (^)(AWSTranslateGetParallelDataResponse *response, NSError *error))completionHandler { [[self getParallelData:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateGetParallelDataResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)getTerminology:(AWSTranslateGetTerminologyRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"GetTerminology" outputClass:[AWSTranslateGetTerminologyResponse class]]; } - (void)getTerminology:(AWSTranslateGetTerminologyRequest *)request completionHandler:(void (^)(AWSTranslateGetTerminologyResponse *response, NSError *error))completionHandler { [[self getTerminology:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateGetTerminologyResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)importTerminology:(AWSTranslateImportTerminologyRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"ImportTerminology" outputClass:[AWSTranslateImportTerminologyResponse class]]; } - (void)importTerminology:(AWSTranslateImportTerminologyRequest *)request completionHandler:(void (^)(AWSTranslateImportTerminologyResponse *response, NSError *error))completionHandler { [[self importTerminology:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateImportTerminologyResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)listLanguages:(AWSTranslateListLanguagesRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"ListLanguages" outputClass:[AWSTranslateListLanguagesResponse class]]; } - (void)listLanguages:(AWSTranslateListLanguagesRequest *)request completionHandler:(void (^)(AWSTranslateListLanguagesResponse *response, NSError *error))completionHandler { [[self listLanguages:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateListLanguagesResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)listParallelData:(AWSTranslateListParallelDataRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"ListParallelData" outputClass:[AWSTranslateListParallelDataResponse class]]; } - (void)listParallelData:(AWSTranslateListParallelDataRequest *)request completionHandler:(void (^)(AWSTranslateListParallelDataResponse *response, NSError *error))completionHandler { [[self listParallelData:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateListParallelDataResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)listTagsForResource:(AWSTranslateListTagsForResourceRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"ListTagsForResource" outputClass:[AWSTranslateListTagsForResourceResponse class]]; } - (void)listTagsForResource:(AWSTranslateListTagsForResourceRequest *)request completionHandler:(void (^)(AWSTranslateListTagsForResourceResponse *response, NSError *error))completionHandler { [[self listTagsForResource:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateListTagsForResourceResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)listTerminologies:(AWSTranslateListTerminologiesRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"ListTerminologies" outputClass:[AWSTranslateListTerminologiesResponse class]]; } - (void)listTerminologies:(AWSTranslateListTerminologiesRequest *)request completionHandler:(void (^)(AWSTranslateListTerminologiesResponse *response, NSError *error))completionHandler { [[self listTerminologies:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateListTerminologiesResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)listTextTranslationJobs:(AWSTranslateListTextTranslationJobsRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"ListTextTranslationJobs" outputClass:[AWSTranslateListTextTranslationJobsResponse class]]; } - (void)listTextTranslationJobs:(AWSTranslateListTextTranslationJobsRequest *)request completionHandler:(void (^)(AWSTranslateListTextTranslationJobsResponse *response, NSError *error))completionHandler { [[self listTextTranslationJobs:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateListTextTranslationJobsResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)startTextTranslationJob:(AWSTranslateStartTextTranslationJobRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"StartTextTranslationJob" outputClass:[AWSTranslateStartTextTranslationJobResponse class]]; } - (void)startTextTranslationJob:(AWSTranslateStartTextTranslationJobRequest *)request completionHandler:(void (^)(AWSTranslateStartTextTranslationJobResponse *response, NSError *error))completionHandler { [[self startTextTranslationJob:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateStartTextTranslationJobResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)stopTextTranslationJob:(AWSTranslateStopTextTranslationJobRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"StopTextTranslationJob" outputClass:[AWSTranslateStopTextTranslationJobResponse class]]; } - (void)stopTextTranslationJob:(AWSTranslateStopTextTranslationJobRequest *)request completionHandler:(void (^)(AWSTranslateStopTextTranslationJobResponse *response, NSError *error))completionHandler { [[self stopTextTranslationJob:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateStopTextTranslationJobResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)tagResource:(AWSTranslateTagResourceRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"TagResource" outputClass:[AWSTranslateTagResourceResponse class]]; } - (void)tagResource:(AWSTranslateTagResourceRequest *)request completionHandler:(void (^)(AWSTranslateTagResourceResponse *response, NSError *error))completionHandler { [[self tagResource:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateTagResourceResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)translateDocument:(AWSTranslateTranslateDocumentRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"TranslateDocument" outputClass:[AWSTranslateTranslateDocumentResponse class]]; } - (void)translateDocument:(AWSTranslateTranslateDocumentRequest *)request completionHandler:(void (^)(AWSTranslateTranslateDocumentResponse *response, NSError *error))completionHandler { [[self translateDocument:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateTranslateDocumentResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)translateText:(AWSTranslateTranslateTextRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"TranslateText" outputClass:[AWSTranslateTranslateTextResponse class]]; } - (void)translateText:(AWSTranslateTranslateTextRequest *)request completionHandler:(void (^)(AWSTranslateTranslateTextResponse *response, NSError *error))completionHandler { [[self translateText:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateTranslateTextResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)untagResource:(AWSTranslateUntagResourceRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"UntagResource" outputClass:[AWSTranslateUntagResourceResponse class]]; } - (void)untagResource:(AWSTranslateUntagResourceRequest *)request completionHandler:(void (^)(AWSTranslateUntagResourceResponse *response, NSError *error))completionHandler { [[self untagResource:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateUntagResourceResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } - (AWSTask *)updateParallelData:(AWSTranslateUpdateParallelDataRequest *)request { return [self invokeRequest:request HTTPMethod:AWSHTTPMethodPOST URLString:@"" targetPrefix:@"AWSShineFrontendService_20170701" operationName:@"UpdateParallelData" outputClass:[AWSTranslateUpdateParallelDataResponse class]]; } - (void)updateParallelData:(AWSTranslateUpdateParallelDataRequest *)request completionHandler:(void (^)(AWSTranslateUpdateParallelDataResponse *response, NSError *error))completionHandler { [[self updateParallelData:request] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { AWSTranslateUpdateParallelDataResponse *result = task.result; NSError *error = task.error; if (completionHandler) { completionHandler(result, error); } return nil; }]; } #pragma mark - @end