Skip to main content

lib/terminus_db.ex

defmodule TerminusDB do
  @moduledoc """
  An idiomatic Elixir client for [TerminusDB](https://terminusdb.org), the document
  graph database with built-in version control.

  The client provides an immutable `TerminusDB.Config` for connection context, a
  Req-based `TerminusDB.Client` HTTP layer, a typed `TerminusDB.Error`, the
  `TerminusDB.Database` management API, `TerminusDB.Document` CRUD with streaming,
  `TerminusDB.Schema` frame retrieval, `TerminusDB.Branch` management,
  `TerminusDB.Commit` history, `TerminusDB.Diff`, `TerminusDB.Merge` (rebase),
  a `TerminusDB.WOQL` functional query DSL, and `TerminusDB.Telemetry` events on
  every operation. Connection context is **immutable data**, making it safe for
  concurrent use.

  Ecto and ExDatalog integrations are planned for later milestones. See
  `ARCHITECTURE.md` and the ADRs (under `docs/adr/`) for the full design and
  roadmap.

  ## Quick start

      # 1. Configure a connection (immutable context)
      config = TerminusDB.Config.new(endpoint: "http://localhost:6363")

      # 2. Manage databases
      {:ok, _} = TerminusDB.Database.create(config, "mydb",
        label: "My Database",
        comment: "A new database",
        schema: true
      )

      # 3. Scope to a database (for later document work)
      config = TerminusDB.Config.with_database(config, "mydb")

  All public calls return `{:ok, result}` or `{:error, %TerminusDB.Error{}}`. Each
  `!/1`-suffixed variant raises `TerminusDB.Error` instead. Every operation emits
  `:telemetry` events (see `TerminusDB.Telemetry`).
  """

  @version Mix.Project.config()[:version] || "0.0.0"

  @doc """
  Returns the library version string.

  ## Examples

      iex> String.match?(TerminusDB.version(), ~r/^\\d+\\.\\d+\\.\\d+/)
      true

  """
  @spec version() :: String.t()
  def version, do: @version
end