Flow_Browser/PrivateBrowser/Pods/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.m
2024-04-17 14:43:19 +08:00

60 lines
2.1 KiB
Objective-C

#import <Foundation/NSDictionary.h>
#import <Foundation/NSFileHandle.h>
#import <PromiseKit/PromiseKit.h>
#import <Foundation/NSString.h>
#import <Foundation/NSError.h>
#if TARGET_OS_MAC && !TARGET_OS_EMBEDDED && !TARGET_OS_SIMULATOR && !TARGET_OS_UIKITFORMAC
#import "NSTask+AnyPromise.h"
@implementation NSTask (PromiseKit)
- (AnyPromise *)promise {
return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
self.standardOutput = [NSPipe pipe];
self.standardError = [NSPipe pipe];
self.terminationHandler = ^(NSTask *task){
id stdoutData = [[task.standardOutput fileHandleForReading] readDataToEndOfFile];
id stdoutString = [[NSString alloc] initWithData:stdoutData encoding:NSUTF8StringEncoding];
id stderrData = [[task.standardError fileHandleForReading] readDataToEndOfFile];
id stderrString = [[NSString alloc] initWithData:stderrData encoding:NSUTF8StringEncoding];
if (task.terminationReason == NSTaskTerminationReasonExit && self.terminationStatus == 0) {
resolve(PMKManifold(stdoutString, stderrString, stdoutData));
} else {
id cmd = [NSMutableArray arrayWithObject:task.launchPath];
[cmd addObjectsFromArray:task.arguments];
cmd = [cmd componentsJoinedByString:@" "];
id info = @{
NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Failed executing: %@.", cmd],
PMKTaskErrorStandardOutputKey: stdoutString,
PMKTaskErrorStandardErrorKey: stderrString,
PMKTaskErrorExitStatusKey: @(task.terminationStatus),
};
resolve([NSError errorWithDomain:PMKErrorDomain code:PMKTaskError userInfo:info]);
}
};
#if __clang_major__ >= 9
if (@available(macOS 10.13, *)) {
NSError *error = nil;
if (![self launchAndReturnError:&error]) {
resolve(error);
}
} else {
[self launch];
}
#else
[self launch]; // might @throw
#endif
}];
}
@end
#endif