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

Блоки и области видимости

Конфиг редко бывает плоским. В Aura есть две формы вложенности, и различаются они не выводом, а тем, что разрешено писать внутри.

ФормаЧто внутриВ JSON
key: … endтолько свойства — данныевложенный объект
domain "имя" … endсвойства и вычисления (=, shadow, assert, def)объект под ключом-меткой

Литерал объекта: просто данные

security:
  tls:         true
  min_version: "1.3"
end
{ "security": { "tls": true, "min_version": "1.3" } }

Внутри допустимы только свойства. Нужны вычисления — берите domain.

В одну строку

Короткий объект помещается в одну строку: тот же блок, только с запятыми там, где были переводы строк (D38).

resources:
  requests: cpu: "250m", memory: "512Mi" end
  limits:   cpu: "500m", memory: "1Gi" end
end

Запятая разделяет два поля и ничего больше - пропущенная или стоящая перед end даёт E0205, и сообщение говорит, какая именно. aura fmt сохраняет ту форму, которую вы выбрали. Два end в строке (a: b: 1 end end) допустимы, но читаются тяжело: внешний уровень лучше записать блоком.

Внутри списка однострочной форме нужна схема, new Port name: "http", port: 80 end - там запятая разделяет ещё и элементы, а схема заодно проверит поля.

Через =

= привязывает объект ровно так же, как : его выводит (D10): блок тот же, но в результат он не попадает.

defaults =
  port:    8080
  timeout: "30s"
end

limits = cpu: "500m", memory: "1Gi" end

server:
  port:    defaults.port
  timeout: defaults.timeout
end
{ "server": { "port": 8080, "timeout": "30s" } }

Замените defaults = на defaults: - и объект попадёт в вывод; больше в нём ничего не изменится. Если у блока после = забыт end, ошибка укажет на строку с =.

domain — секция со своей областью видимости

Метка становится ключом, а тело — полноценная область: =, shadow, assert работают:

domain "prod"
  replicas: 3
  region:   "eu-central"
end
{ "prod": { "replicas": 3, "region": "eu-central" } }

Метка может быть выражением, не только строковым литералом.

Область видимости и shadow

Внешние переменные видны, но их перекрытие требует явного shadow (D7):

port = 80

domain "prod"
  shadow port = 443 # без `shadow` — E0302
  listen: port      # 443
end

fallback: port # 80 — снаружи ничего не изменилось

Это прямой ответ на вопрос «почему в проде другой порт»: перекрытие видно в коде.

Списки объектов: map без лишних ключевых слов

Тело лямбды — тоже область видимости (D17), поэтому элементы списка описываются напрямую, включая приватные вычисления:

services: ["api", "web"].map (n, i) ->
  base = 8000 # приватно: в JSON не попадёт
  name: n
  port: base + i
end
{
  "services": [
    { "name": "api", "port": 8000 },
    { "name": "web", "port": 8001 }
  ]
}

Поле name здесь — обычное свойство, которое вы пишете сами. Раньше эту строку неявно вставляло ключевое слово component; оно убрано в D17 — язык не добавляет полей за вашей спиной.

Что выбрать

  • Только данные → key: … end.
  • Данные плюс вычисления → domain.
  • Список объектов → map с телом-лямбдой; блок не нужен.

Общее правило: тела кода (def, лямбда, domain) — это области видимости; литерал объекта — это данные.