@@ -26,10 +26,10 @@ public enum TaskEvent {
2626 case launch( command: String )
2727
2828 /// The `Task` has output to `stdout`.
29- case stdOut( String )
29+ case stdOut( Data )
3030
3131 /// The `Task` has output to `stderr`.
32- case stdErr( String )
32+ case stdErr( Data )
3333
3434 /// The `Task` exited successfully.
3535 case exit( statusCode: Int )
@@ -57,9 +57,6 @@ extension TaskEvent: Equatable {
5757/// An error encountered in the execution of a `Task`.
5858public enum TaskError : Error {
5959
60- /// Cannot encode input `String` into `Data` (using UTF8)
61- case cannotEncodeInput( String )
62-
6360 /// An uncaught signal was encountered.
6461 case uncaughtSignal
6562
@@ -72,8 +69,6 @@ extension TaskError: Equatable {
7269 /// Equates two `TaskError`s.
7370 public static func == ( lhs: TaskError , rhs: TaskError ) -> Bool {
7471 switch ( lhs, rhs) {
75- case let ( . cannotEncodeInput( left) , . cannotEncodeInput( right) ) :
76- return left == right
7772 case ( . uncaughtSignal, . uncaughtSignal) :
7873 return true
7974 case let ( . exit( left) , . exit( right) ) :
@@ -117,11 +112,12 @@ public struct Task {
117112 self . environment = environment
118113 }
119114
120- /**
115+ /**
121116 Launch the `Task`.
122- - parameter stdIn: An optional `Observable` to provide `stdin` for the process.
117+
118+ - parameter stdIn: An optional `Observable` to provide `stdin` for the process. Defaults to `nil`.
123119 */
124- public func launch( stdIn: Observable < String > ? = nil ) -> Observable < TaskEvent > {
120+ public func launch( stdIn: Observable < Data > ? = nil ) -> Observable < TaskEvent > {
125121 let process = Process ( )
126122 process. launchPath = self . launchPath
127123 process. arguments = self . arguments
@@ -168,29 +164,19 @@ public struct Task {
168164 }
169165 }
170166
171- private func outPipe( withHandler handler: @escaping ( String ) -> Void ) -> Pipe {
167+ private func outPipe( withHandler handler: @escaping ( Data ) -> Void ) -> Pipe {
172168 let pipe = Pipe ( )
173169
174- pipe. fileHandleForReading. readabilityHandler = { fileHandle in
175- if let string = String ( data: fileHandle. availableData, encoding: . utf8) {
176- handler ( string)
177- }
178- }
170+ pipe. fileHandleForReading. readabilityHandler = { handler ( $0. availableData) }
179171
180172 return pipe
181173 }
182174
183- private func inPipe( stdIn: Observable < String > , errorHandler: @escaping ( Error ) -> Void ) -> Pipe {
175+ private func inPipe( stdIn: Observable < Data > , errorHandler: @escaping ( Error ) -> Void ) -> Pipe {
184176 let pipe = Pipe ( )
185177
186178 stdIn
187- . subscribe ( onNext: { input in
188- guard let data = input. data ( using: . utf8) else {
189- errorHandler ( TaskError . cannotEncodeInput ( input) )
190- return
191- }
192- pipe. fileHandleForWriting. write ( data)
193- } )
179+ . subscribe ( onNext: pipe. fileHandleForWriting. write)
194180 . disposed ( by: disposeBag)
195181
196182 return pipe
0 commit comments