defmodule ExCheckout do @moduledoc """ Documentation for `ExCheckout`. """ alias ExCheckout.Cache alias ExCheckout.Config @doc """ Start a Checkout. ## Examples iex> {status, _} = ExCheckout.new() iex> status == :ok true """ def new, do: ExCheckout.Checkout.Supervisor.start_child() def new(name) do {:ok, pid} = ExCheckout.Checkout.Supervisor.start_child() Cache.register(name, pid) end @doc """ Returns the name and module tuple. iex> ExCheckout.get_transaction_modules() [] """ def get_transaction_modules() do {:ok, modules} = :application.get_key(:ex_checkout, :modules) modules |> Stream.map(&Module.split/1) |> Stream.filter(fn module -> case module do [_, "ExCheckout", "Transaction", _] -> true ["ExCheckout", "Transaction", _] -> true _ -> false end end) |> Stream.map(&Module.concat/1) |> Stream.map(&{&1, apply(&1, :module_id, [])}) |> Enum.map(fn output -> output end) end @doc """ Returns the name and module tuple. iex> ExCheckout.get_shipping_modules() [] """ def get_shipping_modules() do {:ok, modules} = :application.get_key(:ex_checkout, :modules) modules |> Stream.map(&Module.split/1) |> Stream.filter(fn module -> case module do ["Shippex", "Carrier", "_", "Client"] -> false ["ExCheckout", "Carrier", "_", "Client"] -> false [_, "Shippex", "Carrier", "Client"] -> false [_, "ExCheckout", "Carrier", "Client"] -> false ["Shippex", "Carrier", _] -> true [_, "Shippex", "Carrier", _] -> true ["ExCheckout", "Carrier", _] -> true [_, "ExCheckout", "Carrier", _] -> true _ -> false end end) |> Stream.map(&Module.concat/1) |> Stream.map(&{&1, apply(&1, :carrier, [])}) |> Enum.map(fn output -> output end) end @doc false defdelegate carriers(), to: Config @doc false defdelegate carriers(list), to: Config @doc false defdelegate payment_providers(), to: Config @doc false defdelegate payment_providers(list), to: Config @version Mix.Project.config()[:version] def version, do: @version @doc """ Returns the available shipping carriers. iex> ExCheckout.available_carriers() [] """ def available_carriers() do Config.carriers() |> Enum.filter(fn x -> ExCheckout.Carrier.module_exists(x) end) end @doc """ Returns the the available payment processors. iex> ExCheckout.available_payment_processors() [] """ def available_payment_processors() do Config.payment_providers() |> Enum.filter(fn x -> ExCheckout.Transaction.module_exists(x) end) end end