commit 518d69109820fb39d7e9202b4dde4443caa0bf6d
parent 1a5ce574399d1e862d80412ee88a9ef38ff96779
Author: srfsh <dev@srf.sh>
Date: Mon, 17 Oct 2022 17:12:30 +0300
Zenflows.DB.Filter: add xor checker
Useful for OR filtering.
Diffstat:
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/zenflows/db/filter.ex b/src/zenflows/db/filter.ex
@@ -18,11 +18,32 @@
defmodule Zenflows.DB.Filter do
@moduledoc "Filtering helpers for Filter modules."
+alias Ecto.Changeset
+
@type params() :: %{atom() => term()}
-@type error() :: {:error, Ecto.Changeset.t()}
+@type error() :: {:error, Changeset.t()}
@type result() :: {:ok, Ecto.Query.t()} | error()
def escape_like(v) do
Regex.replace(~r/\\|%|_/, v, &"\\#{&1}")
end
+
+@doc """
+Changeset helper to check that `a` and `b` are not provided at the same time.
+"""
+@spec check_xor(Changeset.t(), atom(), atom()) :: Changeset.t()
+def check_xor(cset, a, b) do
+ x = Changeset.get_change(cset, a)
+ y = Changeset.get_change(cset, b)
+
+ if x && y do
+ msg = "can't provide both"
+
+ cset
+ |> Changeset.add_error(a, msg)
+ |> Changeset.add_error(b, msg)
+ else
+ cset
+ end
+end
end