solnic / drops

🛠️ Tools for working with data effectively - data contracts using types, schemas, domain validation rules, type-safe casting, and more.
Other
251 stars 4 forks source link

Add `optional` to the DSL #4

Closed solnic closed 1 year ago

solnic commented 1 year ago

This adds support for defining optional keys. Such keys can be omitted and it won't cause any validation errors.

defmodule TestContract do
  use Drops.Contract

  schema do
    %{
      required(:email) => type(:string, [:filled?]),
      optional(:name) => type(:string, [:filled?])
    }
  end
end

TestContract.conform(%{})
# {:error, [error: {:has_key?, :email}]}

TestContract.conform(%{email: "", name: ""})
# {:error, [error: {:filled?, :name, ""}, error: {:filled?, :email, ""}]}

TestContract.conform(%{email: "jane@doe.org", name: ""})
# {:error, [error: {:filled?, :name, ""}]}

TestContract.conform(%{email: "jane@doe.org"})
# {:ok, %{email: "jane@doe.org"}}

TestContract.conform(%{email: "jane@doe.org", name: "Jane"})
# {:ok, %{name: "Jane", email: "jane@doe.org"}}