lib/result.ex

defmodule Yeelight.Result do
  @moduledoc """
  If the command is sucessfull the result pair
  will have the value "ok" or the value of properties
  for methods get_xx
  Example => {"id": 1, "result": "ok"}
             {"id": 2, "result": ["on", "100"]}

  If the command failed the result pair will be an "error" object
  with the corresponding description
  Example => {"id": 3, "error": {"code": -1, "message": "unsupported method"}}
  """

  def parse_result({:ok, response}) do
    response
    |> String.replace("(", "")
    |> String.replace(")", "")
    |> Jason.decode!()
    |> handle_result()
  end

  def parse_result({:error, reason}) do
    {:error, reason}
  end

  def handle_result(%{"id" => id, "result" => "ok"}), do: {:ok, id}
  def handle_result(%{"id" => id, "result" => ["ok"]}), do: {:ok, id}
  def handle_result(%{"id" => id, "result" => properties}), do: {:ok, id, properties}
  def handle_result(%{"id" => id, "error" => error}), do: {:error, id, error["message"]}
end