joetjen.net
EN DE
Konfigurationssprache

Werte

Jeder Wert in CASC hat einen Typ, den der Parser kennt. Zahlen, Zeitdauern, Größen, Datumsangaben und Adressen kommen typisiert an — die Anwendung muss nichts ein zweites Mal parsen.

Format 1.0

Auf einen Blick

TypBeispiele
nil, booleannil true false
Ganzzahl-17 1_000_000 0xDEAD_BEEF 0o755 0b1101
Gleitkomma3.1415 5e+22 -2E-2 inf -inf
Atominfo :info enabled? :nil
Zeichenkette"escaped\n" 'literal' """multi-line"""
Datum, Zeit1979-05-27 07:32:00 1979-05-27T07:32:00Z
IP-Adresse127.0.0.1 10.0.0.0/8 ::1 fe80::1/64
Zeitdauer500ms 1h30m 1.5h 2d
Bytegröße512MiB 1.5GiB 10GB
Liste[1, 2, 3] ["a" "b"]
Tupel(52.52, 13.405)

Nil und Wahrheitswerte

nil, true und false sind Schlüsselwörter. null, yes oder on gibt es nicht: das sind gewöhnliche Atome.

flags = [nil, true, false, null, yes]
%{"flags" => [nil, true, false, :null, :yes]}

Zahlen

Ganzzahlen haben ein optionales Vorzeichen und lassen sich hexadezimal (0x), oktal (0o) oder binär (0b) schreiben. Gleitkommazahlen brauchen Ziffern auf beiden Seiten des Punkts oder einen Exponenten; 1e3 ist eine Gleitkommazahl. _ trennt Zifferngruppen an beliebiger Stelle. inf, +inf und -inf sind die Unendlichkeiten.

n = [-17, +99, 0xDEAD_BEEF, 0o755, 0b1101, 1_000_000, 3.1415, 5e+22, -2E-2, inf, -inf]
%{"n" => [-17, 99, 3735928559, 493, 13, 1000000, 3.1415, 5.0e22, -0.02,
         :infinity, :neg_infinity]}

Atome

Ein nacktes Wort an Wertposition ist ein Atom — ein symbolischer Name, wie man Log-Level und Modi üblicherweise schreibt. Ein führender : ist optional und nötig, um aus einem reservierten Wort ein Atom zu machen.

levels = [info, :info, enabled?, ready!, handle-otp, :nil]
%{"levels" => [:info, :info, :enabled?, :ready!, :"handle-otp", nil]}

Zeichenketten

Drei Formen für drei Aufgaben:

  • "doppelt" — Escapes \n \r \t \" \\ \uXXXX und Interpolation von @{}, ${}, %{}, !{} und !tag(…).
  • 'einfach' — wörtlich: keine Escapes, keine Interpolation. Gut für Muster und alles voller Backslashes.
  • """dreifach""" — mehrzeilig. Der Zeilenumbruch nach den öffnenden Anführungszeichen entfällt und die gemeinsame Einrückung wird entfernt, der Text darf also mit der Datei eingerückt werden.
@who = "world"
greeting = "hello, @{who}\n"
pattern = '^\d+ @{not interpolated}$'
motd = """
    Welcome to the service.
      Status: operational
    """
%{"greeting" => "hello, world\n",
  "pattern" => "^\\d+ @{not interpolated}$",
  "motd" => "Welcome to the service.\n  Status: operational\n"}

Datum und Uhrzeit

ISO 8601 ohne Anführungszeichen: ein Datum, eine Uhrzeit mit Sekunden (Bruchteile erlaubt) oder beides mit T verbunden. Ein Zeitpunkt mit Z oder Offset ist absolut und wird nach UTC normalisiert; ohne ist es eine lokale Datums-Uhrzeit.

at = [1979-05-27T07:32:00Z, 1979-05-27T07:32:00.999+02:00, 1979-05-27T07:32:00, 1979-05-27, 07:32:00.5]
%{"at" => [~U[1979-05-27 07:32:00Z], ~U[1979-05-27 05:32:00.999Z],
          ~N[1979-05-27 07:32:00], ~D[1979-05-27], ~T[07:32:00.5]]}

IP-Adressen

IPv4- und IPv6-Adressen sind Werte ohne Anführungszeichen, jeweils mit optionalem /Präfix für ein Netz. Ein Oktett über 255 ist ein Ladefehler, keine Zeichenkette.

allow = [127.0.0.1, 10.0.0.0/8, ::1/128, fe80::1]

Zeitdauern

Eine Zahl, direkt gefolgt von einer Einheit: ns, us (oder µs), ms, s, m, h, d. Einheiten lassen sich von groß nach klein kombinieren, jede einmal, mit ganzen Zahlen; eine einzelne Einheit darf Nachkommastellen haben.

timeout = 500ms
window = 1h30m
same = 1.5h
retention = 2d
%{"timeout" => {:duration, 500000000},
  "window" => {:duration, 5400000000000},
  "same" => {:duration, 5400000000000},
  "retention" => {:duration, 172800000000000}}

30m1h (aufsteigend), 1h1h (wiederholt) und 1.5h30m (Bruch in einer Kombination) sind Ladefehler.

Bytegrößen

Dezimale Einheiten B kB MB GB TB PB zählen in Tausendern, binäre Einheiten KiB MiB GiB TiB PiB in 1024ern. Groß- und Kleinschreibung spielt keine Rolle; Nachkommastellen sind erlaubt.

sizes = [512MiB, 1.5GiB, 10GB, 1kib]
%{"sizes" => [{:bytes, 536870912}, {:bytes, 1610612736},
             {:bytes, 10000000000}, {:bytes, 1024}]}

Listen und Tupel

Eine Liste […] enthält beliebige Werte; Kommas, Leerzeichen und Zeilenumbrüche trennen Elemente in beliebiger Mischung. Ein Tupel (…) ist eine feste Gruppe — eine Koordinate, ein Paar — und wird immer als Ganzes ersetzt, nie gemischt.

hosts = [
  "a.internal"
  "b.internal", "c.internal"
]
office = (52.5200, 13.4050)
matrix = [[1, 2], (3, 4)]
%{"hosts" => ["a.internal", "b.internal", "c.internal"],
  "office" => {52.52, 13.405},
  "matrix" => [[1, 2], {3, 4}]}