defmodule Wasmex.Wasi.WasiOptions do
  @moduledoc ~S"""
  Configures WASI support for a Wasmex.Store.

  ## Options

    * `:args` - A list of command line arguments
    * `:env` - A map of environment variables
    * `:preopen` - A list of `Wasmex.Wasi.PreopenOptions` to preopen directories
    * `:stdin` - A `Wasmex.Pipe` to use as stdin
    * `:stdout` - A `Wasmex.Pipe` to use as stdout
    * `:stderr` - A `Wasmex.Pipe` to use as stderr

  ## Example

      iex> {:ok, stdin} = Wasmex.Pipe.new()
      iex> Wasmex.Store.new_wasi(%WasiOptions{
      ...>   args: ["first param", "second param"],
      ...>   env: %{"env_key" => "env_value"},
      ...>   preopen: [
      ...>     %Wasmex.Wasi.PreopenOptions{path: "/tmp"}
      ...>   ],
      ...>   stdin: stdin,
      ...> })
  """

  alias Wasmex.Wasi.PreopenOptions
  alias Wasmex.Pipe

  defstruct [:stdin, :stdout, :stderr, args: [], env: %{}, preopen: []]

  @type t :: %__MODULE__{
          args: [String.t()],
          env: %{String.t() => String.t()},
          preopen: [PreopenOptions],
          stdin: Pipe | nil,
          stdout: Pipe | nil,
          stderr: Pipe | nil
        }
end
