lib/jeff/reply/output_status.ex

defmodule Jeff.Reply.OutputStatus do
  @moduledoc """
  Output Status Report

  OSDP v2.2 Specification Reference: 7.8
  """

  defstruct [:outputs]

  @type state :: :active | :inactive

  @type t :: %__MODULE__{
          outputs: %{non_neg_integer() => state()}
        }

  @spec new(map()) :: t()
  def new(outputs) do
    %__MODULE__{
      outputs: outputs
    }
  end

  @spec decode(<<_::_*8>>) :: t()
  def decode(data) do
    for(<<input::8 <- data>>, do: output_status(input))
    |> Enum.with_index(&{&2, &1})
    |> Enum.into(%{})
    |> new()
  end

  defp output_status(0x00), do: :inactive
  defp output_status(_), do: :active
end