Блоки и области видимости
Конфиг редко бывает плоским. В 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) — это области видимости;
литерал объекта — это данные.