lib/workbench/asset_aliases.ex

defmodule Workbench.AssetAliases do
  @type asset :: Tai.Markets.Asset.symbol()

  @spec for(asset) :: [asset]
  def for(asset, {:ok, config} \\ Workbench.Config.parse()) do
    {asset, config.asset_aliases}
    |> find()
    |> case do
      {:ok, {a, aliases}} -> [a] ++ aliases
      {:error, :not_found} -> [asset]
    end
  end

  defp find({asset, alias_index} = args) do
    alias_index
    |> Map.get(asset)
    |> case do
      nil -> find_as_member(args)
      aliases -> {:ok, {asset, aliases}}
    end
  end

  defp find_as_member({asset, alias_index}) do
    alias_index
    |> Enum.find(fn {_, aliases} ->
      Enum.member?(aliases, asset)
    end)
    |> case do
      {_k, _v} = match -> {:ok, match}
      nil -> {:error, :not_found}
    end
  end
end