Skip to content

Commit 70b046a

Browse files
josevalimmichalmuskala
authored andcommitted
Do not delay execution nor bind over values in json_map, closes #94 (#95)
1 parent 97893dd commit 70b046a

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

lib/helpers.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,20 @@ defmodule Jason.Helpers do
3030
3131
"""
3232
defmacro json_map(kv) do
33+
kv_values = Macro.expand(kv, __CALLER__)
34+
kv_vars = Enum.map(kv_values, fn {key, _} -> {key, generated_var(key, Codegen)} end)
35+
36+
values = Enum.map(kv_values, &elem(&1, 1))
37+
vars = Enum.map(kv_vars, &elem(&1, 1))
38+
3339
escape = quote(do: escape)
3440
encode_map = quote(do: encode_map)
3541
encode_args = [escape, encode_map]
36-
kv_iodata = Codegen.build_kv_iodata(Macro.expand(kv, __CALLER__), encode_args)
42+
kv_iodata = Codegen.build_kv_iodata(kv_vars, encode_args)
3743

3844
quote do
45+
{unquote_splicing(vars)} = {unquote_splicing(values)}
46+
3947
%Fragment{
4048
encode: fn {unquote(escape), unquote(encode_map)} ->
4149
unquote(kv_iodata)

test/helpers_test.exs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ defmodule Jason.HelpersTest do
77
doctest Helpers
88

99
describe "json_map/2" do
10+
test "does not delay execution" do
11+
%Fragment{} = json_map(
12+
foo: Process.put(:json, :bar)
13+
)
14+
15+
assert Process.get(:json) == :bar
16+
end
17+
1018
test "produces same output as regular encoding" do
1119
assert %Fragment{} = helper = json_map(bar: 2, baz: 3, foo: 1)
1220
assert Jason.encode!(helper) == Jason.encode!(%{bar: 2, baz: 3, foo: 1})

0 commit comments

Comments
 (0)