defmodule Zoi.Types.Boolean do @moduledoc false use Zoi.Type.Def, fields: [coerce: false] def new(opts \\ []) do opts = Keyword.merge([error: "invalid type: must be a boolean", coerce: false], opts) apply_type(opts) end defimpl Zoi.Type do def parse(_schema, input, _opts) when is_boolean(input) do {:ok, input} end def parse(schema, input, opts) when is_binary(input) do coerce = Keyword.get(opts, :coerce, schema.coerce) if coerce and input in ["true", "false"] do {:ok, input == "true"} else error(schema) end end def parse(schema, _input, _opts) do error(schema) end defp error(schema) do {:error, schema.meta.error} end def type_spec(_schema, _opts) do quote(do: boolean()) end end defimpl Inspect do def inspect(type, opts) do Zoi.Inspect.inspect_type(type, opts) end end end