lib/foreperson.ex

defmodule Foreperson do
  @moduledoc """
  # Configuration

  Foreperson has 2 configuration options:

  `wait:`

  The amount of time to pause before finalizing startup.  This is useful if the configured process isn't instantly ready.
  For example, if your elixir app uses `ecto` and you want to use `foreperson` to start a `postgres` instance, you can set a
  wait time to ensure postgres is ready before `ecto` tries to connect.

  `processes:`

  A list of exertnal processes that you want to start.  The syntax is the similar to [Phoenix endpoint watchers](https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#module-runtime-configuration).
  The key is the commmand to run, followed by a list of strings representing command args,
  followed by a keyword list of options.

  The available options are:
  - `:wrap`: Use a [zombie process wrapper](https://hexdocs.pm/elixir/master/Port.html#module-zombie-operating-system-processes). Defaults to `true`.
  - `:into`: Injects the result into the given collectable. Defaults to `IO.stream(:stdio, :line)`.
  - `:stderr_to_stdout` - redirects stderr to stdout.  Defaults to `true`.
  - All the options available to [System.cmd/3](https://hexdocs.pm/elixir/System.html#cmd/3-options)

  ### Example
  ```
  config :foreperson,
    wait: 500, # Wait 500ms
    processes: [
      postgres: [], # Run postgres with no command args
      "redis-server": ["--loglevel", "warning", wrap: false] # Run redis, and don't use the wrapper script.
    ]
  ```
  """

  def stream(prefix) do
    %Foreperson.Formatter{prefix: prefix}
  end
end