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