Page MenuHomePhorge

No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/tesla/middleware/path_params.ex b/lib/tesla/middleware/path_params.ex
index d4ae223..3432f5f 100644
--- a/lib/tesla/middleware/path_params.ex
+++ b/lib/tesla/middleware/path_params.ex
@@ -1,14 +1,19 @@
defmodule Tesla.Middleware.PathParams do
@behaviour Tesla.Middleware
+ @rx ~r/:([\w_]+)/
+
@impl true
def call(env, next, _) do
url = build_url(env.url, env.opts[:path_params])
Tesla.run(%{env | url: url}, next)
end
defp build_url(url, nil), do: url
- defp build_url(url, params),
- do: Enum.reduce(params, url, fn {k, v}, u -> String.replace(u, ":#{k}", to_string(v)) end)
+ defp build_url(url, params) do
+ Regex.replace(@rx, url, fn match, key ->
+ to_string(params[String.to_existing_atom(key)] || match)
+ end)
+ end
end
diff --git a/test/tesla/middleware/path_params_test.exs b/test/tesla/middleware/path_params_test.exs
index ae4ac31..886c7c8 100644
--- a/test/tesla/middleware/path_params_test.exs
+++ b/test/tesla/middleware/path_params_test.exs
@@ -1,17 +1,37 @@
defmodule Tesla.Middleware.PathParamsTest do
use ExUnit.Case, async: true
alias Tesla.Env
@middleware Tesla.Middleware.PathParams
test "no params" do
assert {:ok, env} = @middleware.call(%Env{url: "/users/:id"}, [], nil)
assert env.url == "/users/:id"
end
test "passed params" do
opts = [path_params: [id: 42]]
assert {:ok, env} = @middleware.call(%Env{url: "/users/:id", opts: opts}, [], nil)
assert env.url == "/users/42"
end
+
+ test "value is not given" do
+ opts = [path_params: [y: 42]]
+ assert {:ok, env} = @middleware.call(%Env{url: "/users/:x", opts: opts}, [], nil)
+ assert env.url == "/users/:x"
+ end
+
+ test "value is nil" do
+ opts = [path_params: [id: nil]]
+ assert {:ok, env} = @middleware.call(%Env{url: "/users/:id", opts: opts}, [], nil)
+ assert env.url == "/users/:id"
+ end
+
+ test "placeholder contains another placeholder" do
+ opts = [path_params: [id: 1, id_post: 2]]
+
+ assert {:ok, env} = @middleware.call(%Env{url: "/users/:id/p/:id_post", opts: opts}, [], nil)
+
+ assert env.url == "/users/1/p/2"
+ end
end

File Metadata

Mime Type
text/x-diff
Expires
Sat, Sep 19, 1:59 AM (21 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1765235
Default Alt Text
(2 KB)

Event Timeline