Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Форматы: TOML, JSON, YAML

Чтение

Три парсера — методы строки; результат — обычные объекты/списки Aura:

cargo = read_file("./Cargo.toml").parse_toml()
team  = read_file("./team.json").parse_json()
lint  = read_file("./.rules.yaml").parse_yaml()

service:
  name:  cargo.package.name
  owner: team.teams[0].lead
end

Целые числа всех форматов приходят как Int (без потери точности), ошибки парсинга — E0314 с сообщением исходной библиотеки.

Запись

Из CLI — флагом:

aura eval app.aura --format json       # по умолчанию, pretty
aura eval app.aura --format json-flat  # плоские ключи: a.b.c = 1
aura eval app.aura --format yaml
aura eval app.aura --format toml       # требует объект на верхнем уровне

Изнутри языка — методами. У каждого формата их два, и выбор — про то, кто будет читать результат:

configmap:
  # Читает программа: компактная форма, потому что переносы строк всё равно
  # были бы экранированы на входе.
  "app-config.yaml": settings.to_yaml()
  # Читает человек — в `kubectl get cm -o yaml` или в diff: развёрнутая.
  "reference.yaml": settings.to_yaml_pretty()
end

to_json / to_yaml / to_toml дают самую компактную форму, которую допускает формат; to_json_pretty / to_yaml_pretty / to_toml_pretty — форму для человека. Компактный YAML — это flow-стиль, {a: 1, xs: [1, 2]}, обычный YAML, а не диалект. Компактный TOML держит массивы в одну строку.

У CLI наоборот: --format всегда пишет развёрнутую форму, потому что производит документ, а не строку, которая пойдёт внутрь документа.

json-flat склеивает вложенные ключи точкой, и это однозначно лишь пока сама точка не встречается внутри ключа. Ключи, написанные на Aura, — идентификаторы, поэтому не встречается; но parse_json и родственные возвращают то, что было во входных данных, и тогда {"a": {"b": 1}} и {"a.b": 2} оба претендуют на ключ a.b. Это E0604, а не молчаливая перезапись одного значения другим. Пустой объект сплющивается в себя (a.b: {}) — он лист, как и пустой список.

Ограничения TOML честно превращаются в ошибки E0603: нет null, на верхнем уровне обязан быть объект.

Aura как конвертер

Поскольку язык читает и пишет все три формата, миграция — однострочник:

# convert.aura
config: read_file("./legacy.toml").parse_toml()
aura eval convert.aura --allow-read=. --format yaml

В отличие от yq/jq, по пути доступны схемы, assert и merge нескольких источников — конвертация с гарантиями.