lib/hardhat/middleware/path_params.ex

defmodule Hardhat.Middleware.PathParams do
  @moduledoc """
  Use templated URLs with separate params. Unlike `Tesla.Middleware.PathParams`,
  we ensure that all parameters are URL-safe. _This middleware is part of the
  default stack_.
  """

  @behaviour Tesla.Middleware

  @impl Tesla.Middleware
  def call(env, next, _) do
    env =
      if env.opts[:path_params] do
        urlsafe =
          env.opts[:path_params]
          |> Enum.map(fn {key, value} -> {key, URI.encode(value, &URI.char_unreserved?/1)} end)
          |> Enum.to_list()

        Tesla.put_opt(env, :path_params, urlsafe)
      else
        env
      end

    Tesla.run(env, [{Tesla.Middleware.PathParams, :call, [[]]} | next])
  end
end