defmodule Kevo do @moduledoc """ Top-level interface and supervisor for Kevo's API. """ use Supervisor require Logger @spec start_link(opts :: keyword()) :: Supervisor.on_start() def start_link(opts \\ []) do Logger.add_translator({Kevo.StateMachineTranslator, :translate}) name = kevo_name!(opts) config = %{ name: name, api_name: api_name(name), socket_name: socket_name(name), username: username!(opts), password: password!(opts), ws_callback_module: ws_callback_module(opts) } Supervisor.start_link(__MODULE__, config, name: name) end @impl true def init(config) do api = {Kevo.Api.Client, [username: config.username, password: config.password, name: config.api_name]} socket = case config.ws_callback_module do nil -> [] module -> [{Kevo.Socket, [callback_module: module, name: config.socket_name]}] end Supervisor.init([api | socket], strategy: :one_for_one) end @doc """ Retrieves all locks visible to the logged in user. """ defdelegate get_locks(), to: Kevo.Api @doc """ Retrieves the given lock's state. """ @spec get_lock(String.t()) :: {:ok, any()} | {:error, Kevo.ApiError.t()} defdelegate get_lock(lock_id), to: Kevo.Api @doc """ Locks the given lock. """ @spec lock(String.t()) :: :ok | {:error, Kevo.ApiError.t()} defdelegate lock(lock_id), to: Kevo.Api @doc """ Unlocks the given lock. """ @spec unlock(String.t()) :: :ok | {:error, Kevo.ApiError.t()} defdelegate unlock(lock_id), to: Kevo.Api @doc """ Gets the provided lock's event history. Follows the frontend's paging behavior. """ defdelegate get_events(lock_id, page \\ 1, page_size \\ 10), to: Kevo.Api ## Configuration def child_spec(opts) do %{ id: kevo_name!(opts), start: {__MODULE__, :start_link, [opts]} } end defp kevo_name!(opts) do Keyword.get(opts, :name) || raise(ArgumentError, "must supply a name") end defp api_name(name), do: :"#{name}.Api.Client" defp socket_name(name), do: :"#{name}.Socket" defp username!(opts) do Keyword.get(opts, :username) || raise(ArgumentError, "must supply a username") end defp password!(opts) do Keyword.get(opts, :password) || raise(ArgumentError, "must supply a password") end defp ws_callback_module(opts) do Keyword.get(opts, :ws_callback_module) end end