Skip to content

Commit 38cf5c1

Browse files
committed
Add support for Enum values to be defined as a function
1 parent 86dca78 commit 38cf5c1

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

lib/feeb/db/type/enum.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,19 @@ defmodule Feeb.DB.Type.Enum do
99
If a valid `format` is specified, keep as is. However, if one was not specified by the user, infer
1010
it based on the contents of the `values` entry. We assume all entries within `values` will share
1111
the same type (and we will crash otherwise).
12+
13+
We accept `values` being a function, as long as it is a function that returns a list. This might
14+
be useful if the application wants to avoid transitive compile-time dependencies.
1215
"""
16+
def overwrite_opts(%{values: values_fn} = opts, mod, identifier) when is_function(values_fn),
17+
do: overwrite_opts(%{opts | values: values_fn.()}, mod, identifier)
18+
1319
def overwrite_opts(%{format: format} = opts, _, _) do
1420
true = format in [:atom, :safe_atom, :string]
1521
opts
1622
end
1723

18-
def overwrite_opts(%{values: values} = opts, _, identifier) do
24+
def overwrite_opts(%{values: values} = opts, _, identifier) when is_list(values) do
1925
value_types =
2026
values
2127
|> Enum.map(fn value ->

test/db/type/enum_test.exs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,5 +228,22 @@ defmodule Feeb.DB.Type.EnumTest do
228228

229229
assert error =~ "Multiple types in enum"
230230
end
231+
232+
test "supports a function as value generator" do
233+
atom_values_fn = fn -> [:a, :b, :c] end
234+
str_values_fn = fn -> ["x", "y", "z"] end
235+
236+
opts = DB.Type.Enum.overwrite_opts(%{values: atom_values_fn, format: :safe_atom}, nil, nil)
237+
assert opts.values == [:a, :b, :c]
238+
assert opts.format == :safe_atom
239+
240+
opts = DB.Type.Enum.overwrite_opts(%{values: atom_values_fn}, nil, nil)
241+
assert opts.values == [:a, :b, :c]
242+
assert opts.format == :atom
243+
244+
opts = DB.Type.Enum.overwrite_opts(%{values: str_values_fn}, nil, nil)
245+
assert opts.values == ["x", "y", "z"]
246+
assert opts.format == :string
247+
end
231248
end
232249
end

0 commit comments

Comments
 (0)