lib/grizzly/zwave/command_classes/user_code.ex

defmodule Grizzly.ZWave.CommandClasses.UserCode do
  @moduledoc """
  Command Class for working with user codes
  """

  @behaviour Grizzly.ZWave.CommandClass

  alias Grizzly.ZWave.DecodeError

  @type user_id_status :: :occupied | :available | :reserved_by_admin | :status_not_available

  @impl true
  def byte(), do: 0x63

  @impl true
  def name(), do: :user_code

  @spec user_id_status_to_byte(user_id_status()) :: byte()
  def user_id_status_to_byte(:available), do: 0x00
  def user_id_status_to_byte(:occupied), do: 0x01
  def user_id_status_to_byte(:reversed_by_admin), do: 0x02
  def user_id_status_to_byte(:status_not_available), do: 0xFE

  @spec user_id_status_from_byte(byte()) :: {:ok, user_id_status()} | {:error, DecodeError.t()}
  def user_id_status_from_byte(0x00), do: {:ok, :available}
  def user_id_status_from_byte(0x01), do: {:ok, :occupied}
  def user_id_status_from_byte(0x02), do: {:ok, :reversed_by_admin}
  def user_id_status_from_byte(0xFE), do: {:ok, :status_not_available}

  def user_id_status_from_byte(byte),
    do: {:error, %DecodeError{value: byte, param: :user_id_status, command: :user_code_set}}
end