defmodule SteamAPI do @behaviour Tesla.Middleware # steam API helper, based off baseurl and query @impl Tesla.Middleware def call(env, next, interface) do env |> apply_base(interface) |> apply_base("https://api.steampowered.com") |> merge(key: Application.fetch_env!(:steamwebapi, :token)) |> Tesla.run(next) end defp apply_base(env, base) do if Regex.match?(~r/^https?:\/\//i, env.url) do # skip if url is already with scheme env else %{env | url: join(base, env.url)} end end defp merge(env, query) do Map.update!(env, :query, &(&1 ++ query)) end defp join(base, url) do case {String.last(to_string(base)), url} do {nil, url} -> url {"/", "/" <> rest} -> base <> rest {"/", rest} -> base <> rest {_, ""} -> base {_, "/" <> rest} -> base <> "/" <> rest {_, rest} -> base <> "/" <> rest end end end