@@ -192,8 +192,9 @@ defmodule Record do
192
192
Keyword . keyword? ( args ) ->
193
193
create ( atom , fields , args , caller )
194
194
true ->
195
- msg = "expected arguments to be a compile time atom or keywords, got: #{ Macro . to_string args } "
196
- raise ArgumentError , msg
195
+ quote bind_quoted: [ atom: atom , fields: fields , args: args ] do
196
+ Record . __keyword__ ( atom , fields , args )
197
+ end
197
198
end
198
199
end
199
200
@@ -281,4 +282,21 @@ defmodule Record do
281
282
defp find_index ( [ { k , _ } | _ ] , k , i ) , do: i + 2
282
283
defp find_index ( [ { _ , _ } | t ] , k , i ) , do: find_index ( t , k , i + 1 )
283
284
defp find_index ( [ ] , _k , _i ) , do: nil
285
+
286
+ # Returns a keyword list of the record
287
+ @ doc false
288
+ def __keyword__ ( atom , fields , record ) do
289
+ if record? ( record , atom ) do
290
+ [ _tag | values ] = Tuple . to_list ( record )
291
+ join_keyword ( fields , values , [ ] )
292
+ else
293
+ msg = "expected argument to be a literal atom, literal keyword or a #{ atom } () record, got runtime: #{ inspect record } "
294
+ raise ArgumentError , msg
295
+ end
296
+ end
297
+
298
+ defp join_keyword ( [ { field , _default } | fields ] , [ value | values ] , acc ) ,
299
+ do: join_keyword ( fields , values , [ { field , value } | acc ] )
300
+ defp join_keyword ( [ ] , [ ] , acc ) ,
301
+ do: :lists . reverse ( acc )
284
302
end
0 commit comments