Validating Keyword lists in Elixir
I found out that Keyword.validate/2 is a great way to guarantee that a function would be called with the right keyword options. Check this out:
def do_something(%User{} = user, opts \\ []) when is_list(opts) do
{:ok, opts} = Keyword.validate(opts, [:preload])
preload = Keyword.get(opts, :preload, [])
#...
end
Here's some interesting cases:
# fails if you pass an invalid option
Keyword.validate([one: "1", two: "2"], [:one])
# => {:error, [:two]}
# fails if you pass a valid option that is not expected that many times
Keyword.validate([one: "1", one: "again"], [:one])
# => {:error, [:two]}
# it can set default values
Keyword.validate([one: "1"], [:one, two: "5"])
# => {:ok, [two: "5", one: "1"]}
# it succeeds if you pass the right options
Keyword.validate([one: "1", two: "2"], [:one, :two])
# => {:ok, [two: "2", one: "1"]}
Tweet