Conditioner allows you to define and process conditional logic in separated way:
- Create logical representation of conditions:
conditions = %{
"and" => [
["filename", "containsfn", "he"],
["filename", "containsfn", "lo"],
["otherrule", "contains", "lo"],
%{
"or" => [
["filename", "containsfn", "bo"],
["filename", "containsfn", "he"],
%{"and" => true}
]
}
]
}
- Define matcher module with rules:
defmodule SomeMatcher do
# using Conditioner.Matcher is optional, but module provides some convenient functions
use Conditioner.Matcher
def match?(["filename", "containsfn", str], _original_value) do
# match?/2 can return anonymous function or boolean value
fn val ->
String.contains?(val, str)
end
end
def match?(["otherrule", "contains", str], _original_value) do
String.contains?(value, str)
end
def match?("hello", "hello") do
# rule pattern can by anything, i.e. plain string
true
end
end
- Verify conditions by calling matcher with rules:
result = Conditioner.match?(conditions, "hello", SomeMatcher)
-
Conditions are represented as map, so they can be easily serialized and stored,
-
Rules can be represented as any type, as long as rule can be matched by pattern matching mechanism in Elixir,
-
Matcher can be defined as module or anonymous function.
-
0.2.2 - docs improvements, add custom caller exception,
-
0.2.1 - support defining matcher as fun with arity 2,
-
0.2.0 - changed
Conditioner.Matcher.match/3
function signature tomatch?/3
, docs improvements, -
0.1.0 - initial version.
def deps do
[
{:conditioner, "~> 0.2.2"}
]
end
The docs can be found at https://hexdocs.pm/conditioner.