В MSRA путь внутри [...] нельзя сводить только к строке вида a.b.c.
Парсер сравнивает не просто текст, а семантическую identity пути: какие сегменты являются системными маркерами слота, а какие - обычными пользовательскими именами.
Главная идея:
quotedсегмент - это буквальная, явная custom-запись имени.- unquoted сегмент может быть системным только в том слоте, где эта позиция зарезервирована.
- если слот ожидает custom-идентификатор, то quoted и unquoted вариант с одним и тем же текстом обычно относятся к одному и тому же пути.
- если слот ожидает system-branch, то quoted и unquoted формы могут означать разные пути или даже сделать запись невалидной.
app
├─ warmup
├─ defaults
│ └─ func
│ └─ headers
├─ variables
├─ prefixes
├─ regexes
├─ groups
└─ func
└─ <uid>
├─ input
├─ body
├─ headers
├─ url
│ └─ params
├─ examples
│ └─ <name>
└─ extractor
app.defaults.func.headers хранит общие defaults для request policy всех функций.
Локальные app.func.<id>.headers могут их переопределять.
Из этого дерева важно помнить одно: смысл сегмента определяется не только его текстом, но и слотом, в котором он стоит.
Если слот ожидает custom-идентификатор, то кавычки не создают новый путь. Они только делают запись явной.
[app.func.A3A417]
[app.func."A3A417"]
Это один и тот же путь. Если оба заголовка встретятся в одном документе, парсер сообщит о дубликате.
То же самое относится к имени url в слоте идентификатора функции:
[app.func.url]
[app.func."url"]
Здесь url не открывает URL-ветку. В этой позиции это просто uid функции.
После body правила уже другие. До первого системного url все элементы body считаются обычными пользовательскими item-ами.
Как только в этой позиции встречается unquoted url, начинается системная ветка url.
[app.func.A3A417.body.VLOJENNOST.url]
[app.func.A3A417.body.VLOJENNOST."url"]
Это разные пути:
- в первом случае
urlзанимает системный слот; - во втором случае
"url"остаётся literal/custom body item.
Именно поэтому эти заголовки относятся к разным таблицам.
Если нужен именно literal body item с именем url, его нужно писать в кавычках:
[app.func.A3A417.body."url"]
Кавычки не превращают любой текст в допустимый путь. Они только помечают сегмент как literal/custom. Если в этом слоте требуется системный маркер, quoted-вариант может стать невалидным.
Например:
- корни таблиц:
appиmsraдопустимы, quoted root - нет; - в ветке
appтакие дети, какwarmup,variables,prefixes,regexes,groups,func, должны идти без кавычек; - в ветке
urlunquotedparamsоткрывает namespace параметров, а quoted"params"уже не считается системным маркером и в этом слоте не подходит.
Эта семантическая identity используется для:
- обнаружения дублированных таблиц;
- проверки наличия родительских таблиц;
- резолва ссылок;
- навигации в language server.
То есть parser и analysis смотрят не только на сырой текст path.join("."), а на смысл сегментов в контексте слота.
Если хочешь понять, один ли это путь, проверь три вещи:
- Какой слот открыт.
- Это system-позиция или custom-позиция.
- Может ли quoted форма в этом слоте быть literal-именем, или там нужен именно системный маркер.
Если слот custom, то quoted и unquoted вариант обычно один и тот же путь. Если слот system, то quoted и unquoted формы могут расходиться, а quoted вариант может даже быть запрещен.