| defmodule Plausible do | |
| @moduledoc """ | |
| Build-related macros | |
| """ | |
| @ce_builds [:ce, :ce_test, :ce_dev] | |
| defmacro __using__(_) do | |
| quote do | |
| require Plausible | |
| import Plausible | |
| end | |
| end | |
| defmacro on_ee(clauses) do | |
| do_on_ee(clauses) | |
| end | |
| defmacro on_ce(clauses) do | |
| do_on_ce(clauses) | |
| end | |
| # :erlang.phash2(1, 1) == 0 tricks dialyzer as per: | |
| # https://github.com/elixir-lang/elixir/blob/v1.12.3/lib/elixir/lib/gen_server.ex#L771-L778 | |
| # and also tricks elixir >1.18 type checker | |
| defmacro always(term) do | |
| quote do | |
| case :erlang.phash2(1, 1) do | |
| 0 -> | |
| unquote(term) | |
| 1 -> | |
| not unquote(term) | |
| end | |
| end | |
| end | |
| defmacro ee? do | |
| quote do | |
| always(unquote(Mix.env() not in @ce_builds)) | |
| end | |
| end | |
| defmacro ce? do | |
| quote do | |
| always(unquote(Mix.env() in @ce_builds)) | |
| end | |
| end | |
| defp do_on_ce(do: block) do | |
| do_on_ee(do: nil, else: block) | |
| end | |
| defp do_on_ce(do: do_block, else: else_block) do | |
| do_on_ee(do: else_block, else: do_block) | |
| end | |
| defp do_on_ee(do: block) do | |
| do_on_ee(do: block, else: nil) | |
| end | |
| defp do_on_ee(do: do_block, else: else_block) do | |
| if ee?() do | |
| quote do | |
| unquote(do_block) | |
| end | |
| else | |
| quote do | |
| unquote(else_block) | |
| end | |
| end | |
| end | |
| def product_name do | |
| if ee?() do | |
| "Plausible Analytics" | |
| else | |
| "Plausible CE" | |
| end | |
| end | |
| end | |