lib/fluent/native.ex

defmodule Fluent.Native do
  @moduledoc """
  Module
  """
  use Rustler, otp_app: :libfluent, crate: :fluent_native

  @doc """
  Initializes Fluent native bundle for given `locale`, and returns reference to it on succeded initialization.

  Available options:

  * `use_isolating` - if set to **false**, removes isolation for messages. Can be used in specific environments to prevent unnesessary identation.
    Must be set to **true** in for right-to-left locale usages.

  ## Examples:

      iex> init("en")
      {:ok, #Reference<...>}
  """
  @spec init(locale :: Fluent.locale(), opts :: Keyword.t()) ::
          {:ok, Fluent.bundle()} | no_return()
  def init(_locale, _opts \\ []), do: error()

  @doc """
  Adds new FTL `resource` for existing `bundle`.

  Resource **mast be** valid FTL source. The function can returns `:ok` if `resource` is valid,
  and does not return `bundle` reference again, becuse data under the reference is mutable.

  ## Examples:

      iex> {:ok, bundle} = init("en")
      {:ok, #Reference<...>}

      iex> with_resource(bundle, "key = Translation")
      :ok
  """
  @spec with_resource(bundle :: Fluent.bundle(), resource :: String.t()) ::
          :ok | {:error, :bad_resource} | no_return()
  def with_resource(_bundle, _resource), do: error()

  @doc """
  Performs localization for given `message` with given `bundle`.

  Returns `ok` tuple if message is succeeded
  Potentially can crash in the `bundle` that is given not match.
  """
  @spec format_pattern(bundle :: Fluent.bundle(), message :: String.t(), args :: Keyword.t()) ::
          {:ok, String.t()} | {:error, :bad_msg} | no_return()
  def format_pattern(_bundle, _message, _args), do: error()

  @spec assert_locale(locale :: Fluent.locale()) :: :ok | {:error, any} | no_return
  def assert_locale(locale) when is_binary(locale), do: error()

  defp error, do: :erlang.nif_error(:nif_not_loaded)
end