defmodule ExCheckout.Carrier do @doc """ Fetches a Carrier module by its atom/string representation. iex> Carrier.module(:ups) Carrier.UPS iex> Carrier.module("UPS") Carrier.UPS iex> Carrier.module("ups") Carrier.UPS """ @spec module(atom | String.t()) :: module() def module(carrier) when is_atom(carrier) do default_modules = ExCheckout.get_shipping_modules() carriers = Application.get_env(:ex_checkout, :carriers, []) |> Enum.map(fn {k, c} -> module = Keyword.get(c, :module) case module do nil -> Enum.filter(default_modules, fn {_module, module_carrier} -> module_carrier == k end) module -> {k, module} end end) |> Enum.reject(fn x -> x == nil end) module = case Enum.filter(carriers, fn {k, _} -> k == carrier end) do [{_, carrier_module}] -> carrier_module {_, carrier_module} -> carrier_module c -> raise "#{c} is not a supported carrier at this time." end available_carriers = ExCheckout.carriers() if carrier in available_carriers do module else raise ExCheckout.InvalidConfigError, "#{inspect(carrier)} not found in carriers: #{inspect(available_carriers)}" end end def module(string) when is_binary(string) do string |> String.downcase() |> String.to_atom() |> module end @doc """ Checks if Module Exists. iex> Transaction.module_exists(:ups) true iex> Transaction.module_exists("UPS") true iex> Transaction.module_exists("ups") true """ def module_exists(atom, module_list \\ []) when is_atom(atom) do default_modules = ExCheckout.carriers() carriers = Application.get_env(:ex_checkout, :carriers, module_list) |> Enum.map(fn {k, c} -> module = Keyword.get(c, :module) case module do nil -> Enum.filter(default_modules, fn {_module, module_carrier} -> module_carrier == k end) module -> {k, module} end end) |> IO.inspect() |> Enum.reject(fn x -> x == nil end) module = case Enum.filter(carriers, fn {k, _} -> k == atom end) do [{_, carrier_module}] -> carrier_module {_, carrier_module} -> carrier_module _ -> %{} end available_providers = ExCheckout.available_carriers() if module in available_providers do true else false end end end