@@ -192,8 +192,9 @@ defmodule Record do
192192 Keyword . keyword? ( args ) ->
193193 create ( atom , fields , args , caller )
194194 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
197198 end
198199 end
199200
@@ -281,4 +282,21 @@ defmodule Record do
281282 defp find_index ( [ { k , _ } | _ ] , k , i ) , do: i + 2
282283 defp find_index ( [ { _ , _ } | t ] , k , i ) , do: find_index ( t , k , i + 1 )
283284 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 )
284302end
0 commit comments