@@ -225,6 +225,51 @@ defmodule Cache.ETS do
225225 @ impl Cache
226226 def opts_definition , do: @ opts_definition
227227
228+ def opts_definition ( opts ) when is_list ( opts ) do
229+ if Keyword . keyword? ( opts ) do
230+ validate_and_normalize_ets_options ( opts )
231+ else
232+ { :error , "expected a keyword list" }
233+ end
234+ end
235+
236+ def opts_definition ( _opts ) , do: { :error , "expected a keyword list" }
237+
238+ defp validate_and_normalize_ets_options ( opts ) do
239+ case NimbleOptions . validate ( opts , @ opts_definition ) do
240+ { :ok , validated } ->
241+ { :ok , normalize_ets_options ( opts , validated ) }
242+
243+ { :error , % NimbleOptions.ValidationError { } = error } ->
244+ { :error , Exception . message ( error ) }
245+ end
246+ end
247+
248+ defp normalize_ets_options ( original_opts , validated ) do
249+ Enum . reject (
250+ [
251+ maybe_type ( original_opts , validated ) ,
252+ maybe_compressed ( original_opts , validated ) ,
253+ maybe_kv ( original_opts , validated , :read_concurrency ) ,
254+ maybe_kv ( original_opts , validated , :write_concurrency ) ,
255+ maybe_kv ( original_opts , validated , :decentralized_counters )
256+ ] ,
257+ & is_nil / 1
258+ )
259+ end
260+
261+ defp maybe_type ( original_opts , validated ) do
262+ if Keyword . has_key? ( original_opts , :type ) , do: validated [ :type ]
263+ end
264+
265+ defp maybe_compressed ( original_opts , validated ) do
266+ if Keyword . has_key? ( original_opts , :compressed ) and validated [ :compressed ] , do: :compressed
267+ end
268+
269+ defp maybe_kv ( original_opts , validated , key ) do
270+ if Keyword . has_key? ( original_opts , key ) , do: { key , validated [ key ] }
271+ end
272+
228273 @ impl Cache
229274 def start_link ( opts ) do
230275 Task . start_link ( fn ->
0 commit comments