/*
|
* Copyright (c) 2014, Facebook, Inc.
|
* All rights reserved.
|
*
|
* This source code is licensed under the BSD-style license found in the
|
* LICENSE file in the root directory of this source tree. An additional grant
|
* of patent rights can be found in the PATENTS file in the same directory.
|
*
|
*/
|
|
#import "OSSTaskCompletionSource.h"
|
|
#import "OSSTask.h"
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
@interface OSSTask (OSSTaskCompletionSource)
|
|
- (BOOL)trySetResult:(nullable id)result;
|
- (BOOL)trySetError:(NSError *)error;
|
- (BOOL)trySetException:(NSException *)exception;
|
- (BOOL)trySetCancelled;
|
|
@end
|
|
@implementation OSSTaskCompletionSource
|
|
#pragma mark - Initializer
|
|
+ (instancetype)taskCompletionSource {
|
return [[self alloc] init];
|
}
|
|
- (instancetype)init {
|
self = [super init];
|
if (!self) return self;
|
|
_task = [[OSSTask alloc] init];
|
|
return self;
|
}
|
|
#pragma mark - Custom Setters/Getters
|
|
- (void)setResult:(nullable id)result {
|
if (![self.task trySetResult:result]) {
|
[NSException raise:NSInternalInconsistencyException
|
format:@"Cannot set the result on a completed task."];
|
}
|
}
|
|
- (void)setError:(NSError *)error {
|
if (![self.task trySetError:error]) {
|
[NSException raise:NSInternalInconsistencyException
|
format:@"Cannot set the error on a completed task."];
|
}
|
}
|
|
- (void)setException:(NSException *)exception {
|
if (![self.task trySetException:exception]) {
|
[NSException raise:NSInternalInconsistencyException
|
format:@"Cannot set the exception on a completed task."];
|
}
|
}
|
|
- (void)cancel {
|
if (![self.task trySetCancelled]) {
|
[NSException raise:NSInternalInconsistencyException
|
format:@"Cannot cancel a completed task."];
|
}
|
}
|
|
- (BOOL)trySetResult:(nullable id)result {
|
return [self.task trySetResult:result];
|
}
|
|
- (BOOL)trySetError:(NSError *)error {
|
return [self.task trySetError:error];
|
}
|
|
- (BOOL)trySetException:(NSException *)exception {
|
return [self.task trySetException:exception];
|
}
|
|
- (BOOL)trySetCancelled {
|
return [self.task trySetCancelled];
|
}
|
|
@end
|
|
NS_ASSUME_NONNULL_END
|