Documentation
¶
Overview ¶
Package contractroot объявляет ЗАКРЫТОЕ множество корней дерева контрактов и резолвит домен в свой корень ОБХОДОМ дерева.
ПРЕДМЕТ. Пока корень был один, всякий, кому нужно было дерево контрактов или имя пакета домена, писал литерал — `proto/kacho/cloud`, `"kacho.cloud."+домен`, `filepath.Join(root, "kacho", "cloud")`. Литералов таких в дереве десятки, и они были верны ровно до второго корня.
ЧЕМ ЭТО ПЛОХО, И ЭТО ИЗМЕРЕНО. Корней стало два: платформа называет себя `kacho`, служба доступа — `kaname` (KAN-PKG-1, решение Р14 замысла перехода). Проверка, отбирающая популяцию литералом приставки, после переезда домена НЕ КРАСНЕЕТ и не зеленеет — она МОЛЧИТ: обход находит меньше файлов, чем прежде, и честно печатает «находок ноль» по опустевшей популяции. Отличить это от исправной работы можно только переписью объёма осмотренного, и половина проверок дерева её печатает именно поэтому.
РЕШЕНИЕ. Перечень корней объявлен ЗДЕСЬ и в единственном экземпляре; домен резолвится в корень обходом, а не выводится из имени. Имя домена о своём корне не сообщает ничего, и всякий вывод по имени был бы второй копией этого перечня — расходящейся молча.
ПУСТОЙ ПЕРЕЧЕНЬ ОЗНАЧАЛ БЫ «НИ ОДНОГО КОРНЯ», то есть пустую популяцию у каждого читателя. Читатели обязаны ронять прогон на пустом обходе сами — пакет за них этого не решает, но и пустым перечень быть не может: он объявлен константой, а не собран из окружения.
Index ¶
- Variables
- func CloudDirs(protoDir string) []string
- func DomainRoots(protoDir string) []string
- func Domains(protoDir string) []string
- func HasAnyPrefix(s string, prefixes []string) bool
- func NamePrefixes() []string
- func PackageOf(protoDir, domain string) (string, bool)
- func PackagePrefixes() []string
- func PathPrefixes() []string
- func ResolveDomain(protoDir, domain string) (root, dir string, ok bool)
Constants ¶
This section is empty.
Variables ¶
var Roots = []string{"kacho", "kaname", "corelib"}
Roots — объявленное закрытое множество корней дерева контрактов.
Порядок значим только для устойчивости вывода: домен обязан лежать РОВНО под одним корнем, и `ResolveDomain` возвращает первый совпавший. Два корня, несущие домен с одним именем, — находка дерева, а не случай, который этот пакет обязан разрешать. Третий корень — `corelib` — это НЕЙТРАЛЬНЫЙ дом словаря аннотаций доступа (`corelib.authz.v1`, решение владельца Р12, задача #2089). Домена под ним нет и не предполагается: `CloudDirs` вернёт только существующие каталоги, поэтому резолв домена он не расширяет. Он нужен здесь потому, что читатели этого перечня спрашивают не только «где домен», но и «НАШ ли это пакет»: без него нейтральный словарь в собственном дереве судился бы как чужой код.
Functions ¶
func CloudDirs ¶
CloudDirs — существующие каталоги `<protoDir>/<корень>/cloud`. Возвращает только те, что есть на диске: корень, объявленный и не заведённый, популяцию не расширяет и обход не роняет.
func DomainRoots ¶
DomainRoots — корни, под которыми ДЕЙСТВИТЕЛЬНО лежит дерево доменов (`<корень>/cloud`). Выводится из CloudDirs, а не выписывается вторым списком.
Существует ради обходчиков, которым нужен относительный префикс, а не путь на диске. Прежде они шли по Roots напрямую и склеивали `proto/<корень>/cloud`, молча полагая, что домены есть у КАЖДОГО корня. Полагание было верно, пока корни были только доменными, и отказало на первом же нейтральном корне (`corelib`, задача #2089): обходчик падал на несуществующем каталоге. Место, где «корень без доменов законен», объявлено ОДНО — здесь, — иначе каждый обходчик заводил бы свою проверку и они разошлись бы молча.
ПУСТОЙ ОТВЕТ — НАХОДКА ВЫЗЫВАЮЩЕГО, а не повод продолжить: ноль доменных корней означает, что дерева контрактов нет вовсе. Пакет за вызывающего этого не решает — ронять прогон обязан он сам.
func HasAnyPrefix ¶
HasAnyPrefix — начинается ли s с приставки какого-нибудь объявленного корня.
Существует ради вызывающих, которые прежде писали `strings.HasPrefix(s, "kacho.")`. Литерал был верен, пока корень был один, и после появления второго перестал НАХОДИТЬ дерево второго корня — не покраснел и не позеленел, а замолчал.
func NamePrefixes ¶
func NamePrefixes() []string
NamePrefixes — корни в форме приставки ПОЛНОГО ИМЕНИ (`kacho.`, `kaname.`).
Отдельно от PackagePrefixes: не всякий контракт дерева лежит под `<корень>.cloud.` — каталог прав объявлен как `kacho.iam.authz.catalog.v1`. Отбор по `.cloud.` оставил бы его вне популяции, и это было бы МОЛЧАНИЕ, а не находка.
func PackageOf ¶
PackageOf — имя proto-пакета домена (`<корень>.cloud.<домен>.v1`), РЕЗОЛВЕННОЕ по дереву. Именно это заменяет `"kacho.cloud." + домен + ".v1"`: строка собиралась из литерала, поэтому после переезда домена называла пакет, которого нет, и дескрипторы по ней не находились вовсе.
func PackagePrefixes ¶
func PackagePrefixes() []string
PackagePrefixes — те же корни в форме приставки имени пакета (`kacho.cloud.`, `kaname.cloud.`). Выводится из Roots, а не выписывается: выписанный перечень разошёлся бы с Roots при добавлении третьего корня.
func PathPrefixes ¶
func PathPrefixes() []string
PathPrefixes — те же корни в форме приставки ПУТИ (`kacho/`, `kaname/`).
func ResolveDomain ¶
ResolveDomain — корень и каталог, под которым лежит дерево домена. ok=false означает, что домена нет НИ ПОД ОДНИМ объявленным корнем: это находка вызывающего, а не повод молча продолжить с пустой популяцией.
Types ¶
This section is empty.