joetjen.net
EN DE
Datenformat

Das Datenformat DXN

DXN — Data eXchange Notation — ist ein Datenmodell in zwei Schreibweisen: .dxn, eine Textform zum Lesen und Bearbeiten, und .dxnb, eine Binärform auf CBOR-Basis. Beide tragen dieselben 28 Typen, von exakten Dezimalzahlen bis zu Mengen, Structs und Zeitstempeln, und lassen sich verlustfrei ineinander überführen.

Format 1.0

Ein erster Blick

Ein DXN-Dokument ist ein einzelner Wert. Dieses hier ist eine Map, die den Großteil des Formats auf einmal nutzt:

user.dxn
@dxn "1.0"
%{
  id:      @uuid "550e8400-e29b-41d4-a716-446655440000"
  name:    "Ada Lovelace"
  active:  true
  score:   19.99M
  tags:    @{:admin :staff}
  meta:    @ordered %{created: ~U[1990-01-01 00:00:00Z]}
  address: %Point[51.05, 13.74]
  result:  {:ok, 200}
  handle:  ~r/^[a-z0-9_]{3,20}$/i
}
  • @dxn "1.0" ist eine optionale Kopfzeile mit der Formatversion.
  • %{…} ist eine Map; name: ist ein Keyword-Schlüssel. Kommas sind überall optional.
  • 19.99M ist eine exakte Dezimalzahl, keine Gleitkommazahl — der Typ für Geldbeträge.
  • @{…} ist eine Menge, {…} ein Tupel, @ordered %{…} eine Map, deren Reihenfolge zu ihrem Wert gehört.
  • %Point[…] ist ein Struct, nach Position geschrieben; ein Schema gibt seinen Feldern Namen und Typen.
  • @uuid, ~U[…] und ~r/…/ sind eine UUID, ein UTC-Zeitstempel und ein regulärer Ausdruck — Werte eigenen Typs, keine Zeichenketten.

Dasselbe Dokument als .dxnb braucht 215 statt 305 Bytes und wird wieder zu exakt demselben Wert dekodiert.

Gestaltung

  • Ein Modell, zwei Kodierungen. Jeder Wert hat eine Text- und eine Binärform, und der Weg hin und zurück ist verlustfrei.
  • Exakte Zahlen. Ganzzahlen haben beliebige Genauigkeit; Dezimalzahlen und Brüche sind exakt und bleiben es auch binär.
  • Absicht in der Syntax. Ein Tupel ist keine Liste, eine geordnete Map keine Map, eine Menge keine Liste ohne Duplikate — der Unterschied steht im Dokument, statt nebenbei vereinbart zu werden.
  • Robust bei Unbekanntem. Ein Struct oder Tag, das ein Leser nicht kennt, wird trotzdem gelesen — als undurchsichtiger Wert, den er unverändert weitergeben kann.
  • Schemas in derselben Notation. Ein .dxns-Schema ist ein DXN-Dokument; eine zweite Sprache gibt es nicht.
  • Vertraut für Elixir-Augen. Maps, Tupel, Keywords, Sigils und ?c-Zeichen sind so geschrieben, wie Elixir sie schreibt.

Eckdaten

EigenschaftWert
Endungen.dxn Text, .dxnb binär, .dxns Schema
TextkodierungUTF-8
Textkopf@dxn "1.0" — optional, nur als erste Form
BinärDX, ein Versionsbyte, dann ein CBOR-Element (RFC 8949) — siehe Binärformat
Kommentare# bis zum Zeilenende; nur im Text
GrammatikPEG, geschrieben in Aether — siehe Grammatik

Implementierungen

Diese Seiten beschreiben das Format. Die folgenden Bibliotheken lesen und schreiben es; ihre API steht jeweils in der eigenen Dokumentation.

NameSpracheRolle
dextrinElixirDie Referenzimplementierung: Text, Binär und Schemas
node-dextrinJavaScriptDieselben Dokumente für Node.js
php-dextrinPHPDieselben Dokumente für PHP
dextrin_htmlElixirWandelt zwischen HTML und DXN
ichorElixirDer Grammatik-Compiler, der den Textparser von dextrin erzeugt

Auf diesen Seiten

  • Textformat — Dokumente, Trenner, Kommentare, Bezeichner, Tags und Verwerfen.
  • Werte — alle 28 Typen und ihre Schreibweise.
  • Binärformat — Umschlag, CBOR-Abbildung, private Tags und Wertteilung.
  • Schemas — .dxns-Dokumente: Typausdrücke, Struct-Schemas und Durchsetzung.
  • Grammatik — die formale Grammatik und wo die Referenzimplementierung noch davon abweicht.