defmodule Ammoprices.Scraping.CaliberMatcher do @moduledoc false def match(title, calibers) do downcased_title = String.downcase(title) prepped = Enum.map(calibers, &prepare_caliber/1) case Enum.find(prepped, fn caliber -> name_matches?(downcased_title, caliber) or alias_matches?(downcased_title, caliber) end) do nil -> nil caliber -> caliber.original end end defp prepare_caliber(caliber) do %{ original: caliber, name: String.downcase(caliber.name), aliases: Enum.map(caliber.aliases, &String.downcase/1) } end defp name_matches?(downcased_title, caliber) do String.contains?(downcased_title, caliber.name) end defp alias_matches?(downcased_title, caliber) do Enum.any?(caliber.aliases, fn a -> String.contains?(downcased_title, a) end) end end