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
|