defmodule Fluent.Assembly do @moduledoc """ Module """ @type t :: atom() @doc """ Doc for using macro opts: * otp_app: "libfluen" * priv: "priv/fluent" * default_locale: "en-US" """ defmacro __using__(opts) do quote location: :keep do @otp_app Keyword.fetch!(unquote(opts), :otp_app) @priv Keyword.get(unquote(opts), :priv, "fluent") @default_locale Keyword.get(unquote(opts), :default_locale, "en") @silent_errors Keyword.get(unquote(opts), :silent_errors, false) @spec __config__(atom()) :: any() def __config__(:otp_app), do: @otp_app def __config__(:sys), do: Application.get_env(@otp_app, __MODULE__, []) def __config__(:priv), do: Keyword.get(__config__(:sys), :priv, nil) || @priv def __config__(:default_locale), do: Keyword.get(__config__(:sys), :default_locale, nil) || @default_locale def __config__(:silent_errors), do: Keyword.get(__config__(:sys), :silent_errors, nil) || @silent_errors @spec __store__() :: Fluent.Store.t() def __store__ do Fluent.Store.get_store(__MODULE__) end def ftl(message, args \\ []) do locale = Fluent.get_locale(__MODULE__) case Fluent.Store.format_pattern(__store__(), locale, message, args) do {:ok, message} -> message _ -> case __config__(:silent_errors) do true -> message false -> raise( Fluent.MessageNotFound, msg: message, locale: locale, assembly: __MODULE__ ) end end end end end end