NimbleOptionsEx (nimble_options_ex v0.2.0)
View SourceSet of custom functions to enhance the UX with NimbleOptions.
Summary
Functions
Validates that the term passed implements Access behaviour.
Example:
iex> schema = [
...> container: [
...> required: true,
...> type: {:custom, NimbleOptionsEx, :access?, []},
...> doc: "The implementation of `Access` to be used as a storage"
...> ]
...> ]
iex> NimbleOptions.validate([container: %{}], schema)
{:ok, [container: %{}]}
iex> NimbleOptions.validate([container: [foo: :bar]], schema)
{:ok, [container: [foo: :bar]]}
iex> NimbleOptions.validate([container: [1, 2, 3]], schema)
{:error, %NimbleOptions.ValidationError{
message: "invalid value for :container option: expected a keyword list, got a list ‹[1, 2, 3]›",
key: :container, value: [1, 2, 3], keys_path: []}}
@spec behaviour(module() | any(), module() | {module(), :strict} | []) :: {:ok, validated_option :: module()} | {:error, String.t()}
Validates a behaviour specified as a module or as a set of functions.
Example:
iex> schema = [
...> container: [
...> required: true,
...> type: {:custom, NimbleOptionsEx, :behaviour, [Supervisor]},
...> doc: "The implementation of `Supervisor` to be used as a supervisor"
...> ]
...> ]
iex> NimbleOptions.validate([container: DynamicSupervisor], schema)
{:ok, [container: DynamicSupervisor]}
iex> NimbleOptions.validate([container: DateTime], schema)
{:error, %NimbleOptions.ValidationError{
message: "invalid value for :container option: module ‹DateTime› does not implement requested callbacks ‹[init: 1]›",
key: :container, value: DateTime, keys_path: []}}If no arguments are given, the checker would make sure the module passed is indeed a module, available at the moment of invocation.
Please note, that Access behaviour is somewhat special, because
it’s supported for terms, such as maps %{foo: :bar} (not Map,)
keywords [foo: :bar] (not Keyword,) and structs %Strct{foo: :bar}
(not Strct module itself.) Use access?/1 validator to check
whether Access is supported by a term itself.
@spec property(term(), atom() | tuple() | keyword()) :: {:ok, validated_option :: module()} | {:error, String.t()}
Validates that the term passed is a prop, a member of a prop_list.
Example:
iex> schema = [
...> prop: [
...> required: true,
...> type: {:custom, NimbleOptionsEx, :property, [:string]},
...> doc: "The property of type `{atom(), binary()}`"
...> ]
...> ]
iex> NimbleOptions.validate([prop: {:foo, "bar"}], schema)
{:ok, [prop: {:foo, "bar"}]}
iex> NimbleOptions.validate([prop: {:foo, 42}], schema)
{:error, %NimbleOptions.ValidationError{
message: "invalid value for :prop option: invalid value for :foo option: expected string, got: 42",
key: :prop, keys_path: [], value: {:foo, 42}}}