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.
Auf einen Blick
| Typ | Beispiele |
|---|---|
| nil, boolean | nil true false |
| Ganzzahl | -17 1_000_000 0xDEAD_BEEF 0o755 0b1101 |
| Gleitkomma | 3.1415 5e+22 -2E-2 inf -inf |
| Atom | info :info enabled? :nil |
| Zeichenkette | "escaped\n" 'literal' """multi-line""" |
| Datum, Zeit | 1979-05-27 07:32:00 1979-05-27T07:32:00Z |
| IP-Adresse | 127.0.0.1 10.0.0.0/8 ::1 fe80::1/64 |
| Zeitdauer | 500ms 1h30m 1.5h 2d |
| Bytegröße | 512MiB 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 \" \\ \uXXXXund 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}]}