34 lines
748 B
Elixir
34 lines
748 B
Elixir
defmodule Frenzy.FilterEngine do
|
|
def matches?(item, filter) do
|
|
score =
|
|
filter.rules
|
|
|> Enum.map(fn rule -> score(item, rule) end)
|
|
|> Enum.sum()
|
|
|
|
score >= filter.score
|
|
end
|
|
|
|
def score(item, rule) do
|
|
prop_value = get_property(item, rule.property)
|
|
|
|
if matches(prop_value, rule.mode, rule.param) do
|
|
rule.weight
|
|
else
|
|
0
|
|
end
|
|
end
|
|
|
|
def matches(value, "contains_string", param) do
|
|
String.contains?(value, param)
|
|
end
|
|
|
|
def matches(value, "matches_regex", param) do
|
|
regex = Regex.compile(param)
|
|
String.match?(value, regex)
|
|
end
|
|
|
|
def get_property(item, "url"), do: item.url
|
|
def get_property(item, "title"), do: item.title
|
|
def get_property(item, "author"), do: item.author
|
|
end
|