Libary provides support for saving CRDT data and values to db using Ecto.
It provides:
- changeset function
cast_crdt, - Ecto.Schema macro
crdt_field - custom Ecto types, with generic support of lasp-lang/types library underneath.
Currently we actively use the following types from lasp-lang:
- :state_awset
- :state_lwwregistry
Other types have very basic support. So feel free to contribute!
- Add
ecto_crdt_typesto your list of dependencies inmix.exs:
def deps do
[{:ecto_crdt_types, "~> 0.4.0"}]
end- Ensure
ecto_crdt_typesis started before your application:
def application do
[applications: [:ecto_crdt_types]]
endDefine Ecto schema and changeset:
defmodule User do
use Ecto.Schema
import EctoCrdtTypes.Fields
alias EctoCrdtTypes.Types.State.AWSet
schema "users" do
field :name, :string
crdt_field :devices, AWSet
end
def changeset(model, params) do
params
|> cast(params, [:name])
|> cast_crdt([:devices])
end
endInitialize new User changeset:
iex> alias EctoCrdtTypes.Types.State.AWSet
iex> user =
%User{}
|> User.changeset(%{"name" => "My Name", "devices_crdt" => AWSet.new([]))
|> Repo.insert(user)