Command

Command

Represents a command to be executed in a child process.

{
    status : Result {} [ExitCode I32, KilledBySignal, IOError Str],
    stdout : List U8,
    stderr : List U8,
}

Output

Represents the output of a command.

{
    status : Result {} [ExitCode I32, KilledBySignal, IOError Str],
    stdout : List U8,
    stderr : List U8,
}

new : Str -> Command

Create a new command to execute the given program in a child process.

Command.new "sqlite3" # Execute "sqlite3" program

arg : Command, Str -> Command

Add a single argument to the command.

# Represent the command "ls -l"
Command.new "ls"
|> Command.arg "-l"

args : Command, List Str -> Command

Add multiple arguments to the command.

# Represent the command "ls -l -a"
Command.new "ls"
|> Command.args ["-l", "-a"]

env : Command, Str, Str -> Command

Add a single environment variable to the command.

# Run "env" and add the environment variable "FOO" with value "BAR"
Command.new "env"
|> Command.env "FOO" "BAR"

envs : Command, List ( Str, Str ) -> Command

Add multiple environment variables to the command.

# Run "env" and add the variables "FOO" and "BAZ"
Command.new "env"
|> Command.envs [("FOO", "BAR"), ("BAZ", "DUCK")]

clearEnvs : Command -> Command

Clear all environment variables, and prevent inheriting from parent, only the environment variables provided to command are available to the child.

# Represents "env" with only "FOO" environment variable set
Command.new "env"
|> Command.clearEnvs
|> Command.env "FOO" "BAR"

output : Command -> Task Output *

Execute command and capture stdout and stderr

Stdin is not inherited from the parent and any attempt by the child process to read from the stdin stream will result in the stream immediately closing.

output <-
    Command.new "sqlite3"
    |> Command.arg dbPath
    |> Command.arg ".mode json"
    |> Command.arg "SELECT id, task, status FROM todos;"
    |> Command.output
    |> Task.await

when output.status is
    Ok {} -> jsonResponse output.stdout
    Err _ -> byteResponse 500 output.stderr

status : Command -> Task {} Error

Execute command and inheriting stdin, stdout and stderr from parent

# Log request date, method and url using echo program
date <- Utc.now |> Task.map Utc.toIso8601Str |> Task.await
result <-
    Command.new "echo"
    |> Command.arg "$(date) $(Http.methodToStr req.method) $(req.url)"
    |> Command.status
    |> Task.attempt

when result is
    Ok {} -> respond "Command succeeded\n"
    Err (ExitCode code) -> respond "Command exited with code $(Num.toStr code)\n"
    Err (KilledBySignal) -> respond "Command was killed by signal\n"
    Err (IOError str) -> respond "IO Error: $(str)\n"