Last active
December 26, 2015 01:29
-
-
Save ctaggart/7071437 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace SourceLink | |
open System | |
open FSharp.Control.Observable // for GuardedAwaitObservable from FSharx.Core | |
type Process() = | |
let si = Diagnostics.ProcessStartInfo() | |
do | |
si.UseShellExecute <- false | |
si.WindowStyle <- Diagnostics.ProcessWindowStyle.Hidden | |
si.RedirectStandardOutput <- true | |
si.RedirectStandardError <- true | |
let stdout = Event<string>() | |
let stderr = Event<string>() | |
member x.FileName with set v = si.FileName <- v | |
member x.Arguments with set v = si.Arguments <- v | |
member x.WorkingDirectory with set v = si.WorkingDirectory <- v | |
[<CLIEvent>] | |
member x.Stdout = stdout.Publish | |
[<CLIEvent>] | |
member x.Stderr = stderr.Publish | |
member x.Run() = | |
use p = new Diagnostics.Process() | |
p.StartInfo <- si | |
p.OutputDataReceived |> Event.add(fun ev -> if ev.Data <> null then stdout.Trigger ev.Data) | |
p.ErrorDataReceived.Add(fun ev -> if ev.Data <> null then stderr.Trigger ev.Data) | |
p.Start() |> ignore | |
p.BeginOutputReadLine() | |
p.BeginErrorReadLine() | |
p.WaitForExit() | |
p.ExitCode | |
member x.AsyncRun() = async { | |
use p = new Diagnostics.Process() | |
p.StartInfo <- si | |
p.OutputDataReceived |> Event.add(fun ev -> if ev.Data <> null then stdout.Trigger ev.Data) | |
p.ErrorDataReceived.Add(fun ev -> if ev.Data <> null then stderr.Trigger ev.Data) | |
p.Start() |> ignore | |
p.BeginOutputReadLine() | |
p.BeginErrorReadLine() | |
// attaches handler to Exited event, enables raising events, then awaits event | |
// the event gets triggered even if process has already finished | |
let! _ = Async.GuardedAwaitObservable p.Exited (fun _ -> p.EnableRaisingEvents <- true) | |
return p.ExitCode } | |
member x.RunAsync() = x.AsyncRun() |> Async.StartAsTask |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let p = Process(FileName="where", Arguments="msbuild") | |
let writeOut = printfn "%s" | |
p.Stdout |> Event.add writeOut | |
p.Stderr |> Event.add writeOut | |
let exitCode = p.Run() | |
printfn "exit code: %d" exitCode | |
printfn "" | |
let p = Process(FileName="where", Arguments="fsc") | |
let writeOut = printfn "%s" | |
use subscriptionStdOut = p.Stdout |> Observable.subscribe writeOut | |
use subscriptionStderr = p.Stderr |> Observable.subscribe writeOut | |
let exitCode = p.AsyncRun() |> Async.RunSynchronously | |
printfn "exit code: %d" exitCode |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment