@@ -37,7 +37,7 @@ defmodule Table.Reader.Enumerable do
3737 case columns_for ( head ) do
3838 { :ok , columns } ->
3939 meta = % { columns: columns }
40- enum = Table.Mapper . map ( enum , & record_values ( & 1 , columns ) )
40+ enum = Table.Mapper . map ( enum , & record_values ( & 1 , columns , head ) )
4141 { :rows , meta , enum }
4242
4343 :error ->
@@ -70,11 +70,17 @@ defmodule Table.Reader.Enumerable do
7070 defp keyval_columns ( [ { key , _ } | rest ] , columns ) , do: keyval_columns ( rest , [ key | columns ] )
7171 defp keyval_columns ( _list , _columns ) , do: :error
7272
73- defp record_values ( record , columns ) when is_list ( record ) do
73+ defp record_values ( record , columns , _head_record ) when is_list ( record ) do
7474 keyval_values ( record , columns )
7575 end
7676
77- defp record_values ( record , columns ) when is_map ( record ) do
77+ defp record_values ( record , columns , head_record ) when is_map ( record ) do
78+ if map_size ( record ) > map_size ( head_record ) do
79+ missing_columns = Map . keys ( record ) -- columns
80+
81+ raise "map records must have the same columns, missing column(s) #{ inspect ( missing_columns ) } in #{ inspect ( head_record ) } "
82+ end
83+
7884 Enum . map ( columns , fn column ->
7985 case record do
8086 % { ^ column => value } ->
@@ -86,7 +92,7 @@ defmodule Table.Reader.Enumerable do
8692 end )
8793 end
8894
89- defp record_values ( record , _columns ) do
95+ defp record_values ( record , _columns , _head_record ) do
9096 raise "invalid table record: #{ inspect ( record ) } "
9197 end
9298
@@ -96,6 +102,14 @@ defmodule Table.Reader.Enumerable do
96102 [ value | keyval_values ( rest , columns ) ]
97103 end
98104
105+ defp keyval_values ( [ ] , [ column | _columns ] ) do
106+ raise "key-value records must have the same columns, missing #{ inspect ( column ) } "
107+ end
108+
109+ defp keyval_values ( [ { column , _value } ] , [ ] ) do
110+ raise "key-value records must have the same columns, missing #{ inspect ( column ) } "
111+ end
112+
99113 defp keyval_values ( [ { actual , _value } | _rest ] , [ column | _columns ] ) do
100114 raise "key-value records must have columns in the same order, expected #{ inspect ( column ) } , but got #{ inspect ( actual ) } "
101115 end
0 commit comments