defmodule DustEcto do @moduledoc """ Ecto-shaped facade over Dust — `DustEcto.Schema` plus `DustEcto.Repo`, designed to feel like the parts of `Ecto.Schema` and `Ecto.Repo` that map cleanly onto Dust's flat KV model. See the design doc at `docs/plans/2026-05-10-dust-ecto-design.md` in the dust monorepo for the rationale, scope, and trade-offs. ## Quick start defmodule MyApp.Reading.Link do use DustEcto.Schema, prefix: ["links"], required: [:slug, :title, :url] embedded_schema do field :title, :string field :url, :string field :note, :string end def changeset(link, attrs) do link |> cast(attrs, [:slug, :title, :url, :note]) |> validate_required(__dust_required_fields__()) |> validate_dust_slug(:slug) end end # Configure once at startup: # config :dustlayer_ecto, # store: System.get_env("DUST_STORE"), # dust_facade: MyApp.Dust # WS-mode (recommended) # # OR for HTTP-only: # # base_url: "https://dustlayer.io", # # token: System.get_env("DUST_TOKEN") Reading.Link.changeset(%Reading.Link{}, %{slug: "x", title: "X", url: "http://x"}) |> DustEcto.Repo.insert() # => {:ok, %Reading.Link{...}} """ @version Mix.Project.config()[:version] @doc "Returns the package version string." def version, do: @version end