Contrak (Contrak v0.3.0) View Source
Contrak helps to validate data with given schema:
task_schema = %{
title: [type: :string, required: true, length: [min: 20]],
description: :string,
tag: [type: {:array, :string}, default: []]
point: [type: :integer, number: [min: 0]],
due_date: [type: NaiveDateTime, default: &seven_day_from_now/0] ,
assignee: [type: {:array, User}, required: true],
attachments: [
type:
{:array,
%{
name: [type: :string, required: true],
url: :string
}}
]
}
case Contrak.validate(data, task_schema) do
{:ok, valid_data} ->
# do your logic
{:error, errors} ->
IO.inspect(errors)
endContrak also do:
- Support nested type
- Clean not allowed fields
NOTES: Contract only validate data, not cast data
Schema definition
Contrak provide a simple schema definition:
<field_name>: [type: <type>, required: <true|false>, default: <value|function>, [...validation]]
Shorthand form if you only check for type:
<field_name>: <type>
typeis all types supported byValdi.validate_type, and extended to support nested type. Nested type is just another schema.default: could be a functionfunc/0or a value. Default function is invoked for every timevalidateis called. If not set, default value isnilrequired: if set totrue, validate if a field does exist and notnil. Default isfalse.validations: all validation support byValdi, if value isnilthen all validation is skip
For more details, please check document for Contrak.Schema
Validations
Contrak uses Valdi to validate data. So you can use all validation from Valdi. This is list of available validation for current version of Valdi:
- Validate type
- Validate required
- Validate
in|not_inenum - Valiate length for
string,enumerable - Validate number
- Validate string against regex pattern
- Custom validation function
Please check Valdi document for more details
Another example
@update_user_contract %{
user: [type: User, required: true],
attributes: [type: %{
email: [type: :string],
status: [type: :string, in: ~w(active in_active)]
age: [type: :integer, number: [min: 10, max: 80]],
}, required: true]
}
def update_user(contract) do
with {:ok, validated_data} do
validated_data.user
|> Ecto.Changeset.change(validated_data.attributes)
|> Repo.update
else
{:error, errors} -> IO.inspect(errors)
end
end
Link to this section Summary
Functions
Validate data against given schema
Link to this section Functions
Specs
Validate data against given schema