zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/zenflows/db/filter.ex | 23++++++++++++++++++++++-
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