Documentation
¶
Overview ¶
brandedknob.go — разбор ИМЁН РУЧЕК с приставкой платформы в прод-коде фундамента.
Что здесь находка ¶
Строковый литерал, начинающийся с приставки, которую назвал ВЫЗЫВАЮЩИЙ, в не-проверочном коде фундамента — находка, КРОМЕ одного случая: он есть значение константы, чьё имя начинается с `Legacy`, то есть объявлен ОКНОМ перехода (см. шапку пакета). Так остаток перестаёт быть остатком: он назван решением, и его снятие видно диффом.
Почему приставку называет ВЫЗЫВАЮЩИЙ, а не этот файл ¶
Приставка — предмет разбора, а не его принадлежность, и держать её здесь значило бы нарушить ровно ту норму, которую разбор стережёт: фундамент читают ОБА продукта, и имя платформы в нём — то самое, что снимается. Константа `BrandedPrefix = "KACHO_"` здесь стояла и БЫЛА НАЙДЕНА этим же гейтом — вердикт справедлив: литерал не «предикат», он такой же бренд платформы в фундаменте, как и остальные семь, только без окна.
Исключать собственный файл было нельзя: перечень прощённых не истекает сам и унаследовал бы следующую слепую зону. Приставка вынесена ПАРАМЕТРОМ — тогда разбор судит свой файл наравне с прочими и молчит на нём по существу, а не по послаблению. Это же отвечает и на «появится второй продукт»: словарь расширяется у вызывающего.
Глобального состояния это не заводит: приставка — довод вызова, а не изменяемая переменная уровня пакета (отвергнутая в шапке `envknob` альтернатива была про ЧТЕНИЕ ручек, а не про разбор дерева).
Чего разбор НЕ видит — названо ¶
- имя, собранное конкатенацией (`"KACHO_" + suffix`): разбор судит литерал целиком. В дереве таких нет (проверено предикатом пробы), и появление такой формы — предмет расширения, а не край;
- имя, пришедшее из данных — файла настроек, чарта. Это не код фундамента;
- приставка ДРУГОГО продукта — ровно до тех пор, пока вызывающий её не назвал: словарь принадлежит ему.
Package envknob — ИМЯ РУЧКИ ФУНДАМЕНТА НЕЙТРАЛЬНО, и переход к нему имеет окно.
Предмет ¶
Фундамент читал семь переменных окружения с приставкой ПЛАТФОРМЫ. Оператор, ставящий службу доступа БЕЗ платформы, настраивал её переменными с чужим брендом, а сменить их не мог: имя выбирает фундамент, и выбор уезжает пином к каждому потребителю разом. Норма «служба наследует от платформы код, но не имя» на них не выполнялась (`PRO-Robotech/corelib#11`).
Решение: нейтральное имя, приставку выбирает НЕ фундамент ¶
Имя ручки называет её ПРЕДМЕТ (`MIGRATOR_DSN`), а не того, кто её читает. Прецедент в продукте есть: доводы образа переведены на `OCI_IMAGE_*`.
Альтернатива «пусть потребитель объявит свою приставку» рассмотрена и отвергнута: она требует изменяемого состояния уровня пакета, устанавливаемого из композиционного корня, — то есть глобального синглтона, который архитектура запрещает, — и не даёт ничего сверх нейтрального имени, потому что приставка у каждого потребителя всё равно одна на установку.
Стандартное имя не переприсваивается: у телеметрии ручка называется так, как её называет сама спецификация, а не нашей копией её имени с приставкой.
Окно, а не слом ¶
Переход объявлен окном: читаются ОБА написания, нейтральное СИЛЬНЕЕ. Слом был бы отказом у каждого потребителя в день подъёма пина, причём отказом молчаливым — незаданная ручка обычно означает «умолчание», а не ошибку.
Окно ЗАКРЫВАЕТСЯ, и предикат его закрытия внешний: ни один профиль развёртывания и ни одна страница установки в деревьях-потребителях не называет прежнего написания. До тех пор прежнее имя остаётся в прод-коде фундамента НАЗВАННЫМ решением, а не остатком.
Что возвращается вызывающему — И ПОЧЕМУ ИМЯ, А НЕ ТОЛЬКО ЗНАЧЕНИЕ ¶
Lookup возвращает ИМЯ, которым значение получено. Без него оператор, задавший прежнее написание, неотличим от задавшего новое, — и окно не закроется никогда: закрывать его будет нечем, кроме памяти.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNoPrefix = errors.New("envknob: приставка не названа — разбор без неё судил бы каждый литерал")
ErrNoPrefix — приставка не названа. Пустая приставка сделала бы находкой КАЖДЫЙ строковый литерал дерева: «не сужаем» здесь означало бы «всё подряд», и гейт утонул бы в находках с первого же прогона.
Functions ¶
func Lookup ¶
Lookup — значение ручки по НЕЙТРАЛЬНОМУ имени, с окном на прежнее.
Возвращает значение, ИМЯ, которым оно получено, и найдено ли оно. Пустое значение заданной переменной значением НЕ считается: у всех семи ручек фундамента пустое означает «не задано», и трактовать его иначе значило бы завести восьмое поведение, о котором никто не решал.
legacy пустое — окна нет, читается только нейтральное имя.
func UsesLegacyName ¶
UsesLegacyName сообщает, что значение пришло ПРЕЖНИМ написанием. Вызывающий, у которого есть журнал, обязан сказать это оператору: иначе окно не закроется.
Types ¶
type BrandedKnob ¶
type BrandedKnob struct {
File string
Line int
// Name — само имя ручки.
Name string
// Const — имя константы, чьим значением литерал является; пусто, если он не
// константа вовсе.
Const string
// InWindow — литерал объявлен окном перехода (`Legacy…`).
InWindow bool
}
BrandedKnob — одно имя ручки с приставкой платформы и его координата.
func ScanBrandedKnobs ¶
func ScanBrandedKnobs(path string, src []byte, prefix string) (found []BrandedKnob, literals int, err error)
ScanBrandedKnobs разбирает один файл и возвращает найденные имена с приставкой.
prefix — приставка, которую фундамент носить не вправе; её называет ВЫЗЫВАЮЩИЙ (почему — в шапке файла). Пустая отвергается ErrNoPrefix.
Второе возвращаемое — сколько строковых литералов осмотрено: «ноль находок» обязано быть отличимо от «ноль прочитанного».
func UnwindowedBrandedKnobs ¶
func UnwindowedBrandedKnobs(all []BrandedKnob) []BrandedKnob
UnwindowedBrandedKnobs — те из найденных, что окном НЕ объявлены.