Skip to content
Basic support for crdt types in ecto
Elixir
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
config
lib
priv/repo/migrations
test
.formatter.exs
.gitignore
.travis.yml
LICENSE.md
README.md
mix.exs
mix.lock

README.md

EctoCrdtTypes Build Status Hex.pm


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!


Installation

  1. Add ecto_crdt_types to your list of dependencies in mix.exs:
def deps do
  [{:ecto_crdt_types, "~> 0.4.0"}]
end
  1. Ensure ecto_crdt_types is started before your application:
def application do
  [applications: [:ecto_crdt_types]]
end

Usage

Define 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
end

Initialize new User changeset:

iex> alias EctoCrdtTypes.Types.State.AWSet

iex> user =
%User{}
|> User.changeset(%{"name" => "My Name", "devices_crdt" => AWSet.new([]))
|> Repo.insert(user)
You can’t perform that action at this time.