Skip to content

Commit a5a07a8

Browse files
committed
chore: call module.__info__(:struct) just once
1 parent 496d5d8 commit a5a07a8

File tree

1 file changed

+35
-33
lines changed

1 file changed

+35
-33
lines changed

lib/mimic/module.ex

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -126,47 +126,49 @@ defmodule Mimic.Module do
126126
module
127127
end
128128

129-
if @elixir_version >= 1.18 do
130-
defp generate_mimic_struct(module) do
131-
if function_exported?(module, :__info__, 1) && module.__info__(:struct) != nil do
132-
struct_info = module.__info__(:struct) || []
129+
defp generate_mimic_struct(module) do
130+
if function_exported?(module, :__info__, 1) do
131+
do_generate_mimic_struct(module, module.__info__(:struct))
132+
end
133+
end
133134

134-
struct_template = Map.from_struct(module.__struct__())
135+
defp do_generate_mimic_struct(_module, nil), do: nil
135136

136-
struct_params =
137-
for %{field: field} <- struct_info,
138-
do: {field, Macro.escape(struct_template[field])}
137+
if @elixir_version >= 1.18 do
138+
defp do_generate_mimic_struct(module, struct_info) do
139+
struct_template = Map.from_struct(module.__struct__())
139140

140-
quote do
141-
defstruct unquote(struct_params)
142-
end
141+
struct_params =
142+
for %{field: field} <- struct_info,
143+
do: {field, Macro.escape(struct_template[field])}
144+
145+
quote do
146+
defstruct unquote(struct_params)
143147
end
144148
end
145149
else
146-
defp generate_mimic_struct(module) do
147-
if function_exported?(module, :__info__, 1) && module.__info__(:struct) != nil do
148-
struct_info =
149-
module.__info__(:struct)
150-
|> Enum.split_with(& &1.required)
151-
|> Tuple.to_list()
152-
|> List.flatten()
153-
154-
required_fields = for %{field: field, required: true} <- struct_info, do: field
155-
struct_template = Map.from_struct(module.__struct__())
156-
157-
struct_params =
158-
for %{field: field, required: required} <- struct_info do
159-
if required do
160-
field
161-
else
162-
{field, Macro.escape(struct_template[field])}
163-
end
150+
defp do_generate_mimic_struct(module, struct_info) do
151+
struct_info =
152+
module.__info__(:struct)
153+
|> Enum.split_with(& &1.required)
154+
|> Tuple.to_list()
155+
|> List.flatten()
156+
157+
required_fields = for %{field: field, required: true} <- struct_info, do: field
158+
struct_template = Map.from_struct(module.__struct__())
159+
160+
struct_params =
161+
for %{field: field, required: required} <- struct_info do
162+
if required do
163+
field
164+
else
165+
{field, Macro.escape(struct_template[field])}
164166
end
165-
166-
quote do
167-
@enforce_keys unquote(required_fields)
168-
defstruct unquote(struct_params)
169167
end
168+
169+
quote do
170+
@enforce_keys unquote(required_fields)
171+
defstruct unquote(struct_params)
170172
end
171173
end
172174
end

0 commit comments

Comments
 (0)