defmodule ExWal do @moduledoc "README.md" |> File.read!() |> String.split("") |> Enum.fetch!(1) @external_resource "README.md" defmacro __using__(opts) do quote do alias ExWal.Core @type ok_t(ret) :: {:ok, ret} @type err_t() :: {:error, term()} def init(config) do {:ok, config} end defoverridable init: 1 def child_spec(opts) do %{ id: __MODULE__, start: {__MODULE__, :start_link, [opts]}, type: :supervisor } end def start_link(config \\ []) do otp_app = unquote(opts[:otp_app]) {:ok, cfg} = otp_app |> Application.get_env(__MODULE__, config) |> init() ExWal.Supervisor.start_link(__MODULE__, cfg) end defp delegate(method, args), do: apply(Core, method, [__MODULE__ | args]) @doc """ Get a manager of the WAL. ## Parameters - `mode`: `:standalone` or `:failover` - `manager_name`: the name of the manager - `opts`: the options of the manager, see `ExWal.Manager.Options.t()` Returns - `{:ok, ExWal.Manager.t()}`: the manager - `{:error, reason}`: the reason of the error """ @spec manager( mode :: :standalone | :failover, manager_name :: term(), opts :: ExWal.Manager.Options.t() ) :: {:ok, ExWal.Manager.t()} | {:error, reason :: term()} def manager(mode, manager_name, opts), do: delegate(:manager, [mode, manager_name, opts]) @doc """ Open a reader for reading the virtual log. Parameters - `vlog`: the virtual log Returns - `{:ok, ExWal.LogReader.t()}`: the reader - `{:error, reason}`: the reason of the error """ @spec open_for_read(vlog :: ExWal.Models.VirtualLog.t()) :: {:ok, ExWal.LogReader.t()} | {:error, reason :: term()} def open_for_read(vlog), do: delegate(:open_for_read, [vlog]) @doc """ Get the syncing file system. """ @spec syncing_fs :: ExWal.FS.t() def syncing_fs, do: ExWal.Supervisor.syncing_fs(__MODULE__) end end end