defmodule Parameter do @moduledoc "README.md" |> File.read!() |> String.split("") |> Enum.fetch!(1) alias Parameter.Dumper alias Parameter.Loader alias Parameter.Types @unknown_opts [:error, :ignore] @spec load(module() | atom(), map(), Keyword.t()) :: {:ok, any()} | {:error, any()} def load(schema, input, opts \\ []) do opts = parse_opts(opts) Loader.load(schema, input, opts) end @spec dump(module() | atom(), map(), Keyword.t()) :: {:ok, any()} | {:error, any()} def dump(schema, input, opts \\ []) when is_map(input) do exclude = Keyword.get(opts, :exclude, []) Types.validate!(:list, exclude) Dumper.dump(schema, input, exclude: exclude) end defp parse_opts(opts) do unknown = Keyword.get(opts, :unknown, :ignore) if unknown not in @unknown_opts do raise("unknown field options should be #{inspect(@unknown_opts)}") end struct = Keyword.get(opts, :struct, false) Types.validate!(:boolean, struct) exclude = Keyword.get(opts, :exclude, []) Types.validate!(:list, exclude) [struct: struct, unknown: unknown, exclude: exclude] end end