Skip to content

Commit

Permalink
add fsharp bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
Mpdreamz committed Jan 15, 2024
1 parent 7c2b196 commit 9728ea4
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 2 deletions.
11 changes: 10 additions & 1 deletion examples/ScratchPad.Fs/Program.fs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
open System
open Proc.Fs

(*
let _ = shell {
exec "dotnet" "--version"
exec "uname"
}

exec { run "dotnet" "--help"}
exec {
Expand Down Expand Up @@ -56,5 +56,14 @@ let _ = shell { exec "dotnet" args }
let statusCode = exec { exit_code_of "dotnet" "--help"}
exec { run "dotnet" "run" "--project" "examples/ScratchPad.Fs.ArgumentPrinter" "--" "With Space" }
*)

let runningProcess = exec {
binary "dotnet"
arguments "run" "--project" "tests/Proc.Tests.Binary" "--" "TrulyLongRunning"
//wait_until (fun l -> l.Line = "Started!")
wait_until_and_disconnect (fun l -> l.Line = "Started!")
}


printfn "That's all folks!"
39 changes: 38 additions & 1 deletion src/Proc.Fs/Bindings.fs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ type ExecOptions = {
Timeout: TimeSpan
ValidExitCodeClassifier: (int -> bool) option

StartedConfirmationHandler: (LineOut -> bool) option
StopBufferingAfterStarted: bool option

NoWrapInThread: bool option
SendControlCFirst: bool option
WaitForStreamReadersTimeout: TimeSpan option
Expand All @@ -26,7 +29,8 @@ with
LineOutFilter = None; WorkingDirectory = None; Environment = None
Timeout = TimeSpan(0, 0, 0, 0, -1)
ValidExitCodeClassifier = None;
NoWrapInThread = None; SendControlCFirst = None; WaitForStreamReadersTimeout = None;
NoWrapInThread = None; SendControlCFirst = None; WaitForStreamReadersTimeout = None
StartedConfirmationHandler = None; StopBufferingAfterStarted = None
}

let private startArgs (opts: ExecOptions) =
Expand All @@ -48,6 +52,21 @@ let private execArgs (opts: ExecOptions) =
opts.ValidExitCodeClassifier |> Option.iter(fun f -> execArguments.ValidExitCodeClassifier <- f)
execArguments

let private longRunningArguments (opts: ExecOptions) =
let args = opts.Arguments |> Option.defaultValue []
let longRunningArguments = LongRunningArguments(opts.Binary, args)
opts.LineOutFilter |> Option.iter(fun f -> longRunningArguments.LineOutFilter <- f)
opts.Environment |> Option.iter(fun e -> longRunningArguments.Environment <- e)
opts.WorkingDirectory |> Option.iter(fun d -> longRunningArguments.WorkingDirectory <- d)
opts.NoWrapInThread |> Option.iter(fun b -> longRunningArguments.NoWrapInThread <- b)
opts.SendControlCFirst |> Option.iter(fun b -> longRunningArguments.SendControlCFirst <- b)
opts.WaitForStreamReadersTimeout |> Option.iter(fun t -> longRunningArguments.WaitForStreamReadersTimeout <- t)

opts.StartedConfirmationHandler |> Option.iter(fun t -> longRunningArguments.StartedConfirmationHandler <- t)
opts.StopBufferingAfterStarted |> Option.iter(fun t -> longRunningArguments.StopBufferingAfterStarted <- t)

longRunningArguments


type ShellBuilder() =

Expand Down Expand Up @@ -251,6 +270,24 @@ type ExecBuilder() =
let startArgs = startArgs opts
Proc.Start(startArgs, opts.Timeout)

[<CustomOperation("wait_until")>]
member this.WaitUntil(opts, startedConfirmation: LineOut -> bool) =
let opts = { opts with StartedConfirmationHandler = Some startedConfirmation }
let longRunningArguments = longRunningArguments opts
Proc.StartLongRunning(longRunningArguments, opts.Timeout)

[<CustomOperation("wait_until_and_disconnect")>]
member this.WaitUntilQuietAfter(opts, startedConfirmation: LineOut -> bool) =
let opts =
{
opts with
StartedConfirmationHandler = Some startedConfirmation
StopBufferingAfterStarted = Some true
}
let longRunningArguments = longRunningArguments opts
Proc.StartLongRunning(longRunningArguments, opts.Timeout)



let exec = ExecBuilder()

Expand Down
21 changes: 21 additions & 0 deletions src/Proc.Fs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,24 @@ let helpOutput = exec {
```

returns the exit code and the full console output.

```fsharp
let process = exec {
binary "dotnet"
arguments "--help"
wait_until (fun l -> l.Line.Contains "clean")
}
```

returns an already running process but only after it confirms a line was printed
```fsharp
let process = exec {
binary "dotnet"
arguments "--help"
wait_until_and_disconnect (fun l -> l.Line.Contains "clean")
}
```

returns an already running process but only after it confirms a line was printed. This version will stop the yielding standard/out lines which may utilize memory consumption which is no longer needed.

0 comments on commit 9728ea4

Please sign in to comment.