Help us shape the future of Go! Take the 2026 Go Developer Survey

contractroot

package
v1.16.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2026 License: Apache-2.0 Imports: 3 Imported by: 0

Documentation

Overview

Package contractroot объявляет ЗАКРЫТОЕ множество корней дерева контрактов и резолвит домен в свой корень ОБХОДОМ дерева.

ПРЕДМЕТ. Пока корень был один, всякий, кому нужно было дерево контрактов или имя пакета домена, писал литерал — `proto/kacho/cloud`, `"kacho.cloud."+домен`, `filepath.Join(root, "kacho", "cloud")`. Литералов таких в дереве десятки, и они были верны ровно до второго корня.

ЧЕМ ЭТО ПЛОХО, И ЭТО ИЗМЕРЕНО. Корней стало два: платформа называет себя `kacho`, служба доступа — `kaname` (KAN-PKG-1, решение Р14 замысла перехода). Проверка, отбирающая популяцию литералом приставки, после переезда домена НЕ КРАСНЕЕТ и не зеленеет — она МОЛЧИТ: обход находит меньше файлов, чем прежде, и честно печатает «находок ноль» по опустевшей популяции. Отличить это от исправной работы можно только переписью объёма осмотренного, и половина проверок дерева её печатает именно поэтому.

РЕШЕНИЕ. Перечень корней объявлен ЗДЕСЬ и в единственном экземпляре; домен резолвится в корень обходом, а не выводится из имени. Имя домена о своём корне не сообщает ничего, и всякий вывод по имени был бы второй копией этого перечня — расходящейся молча.

ПУСТОЙ ПЕРЕЧЕНЬ ОЗНАЧАЛ БЫ «НИ ОДНОГО КОРНЯ», то есть пустую популяцию у каждого читателя. Читатели обязаны ронять прогон на пустом обходе сами — пакет за них этого не решает, но и пустым перечень быть не может: он объявлен константой, а не собран из окружения.

Index

Constants

This section is empty.

Variables

View Source
var Roots = []string{"kacho", "kaname", "corelib"}

Roots — объявленное закрытое множество корней дерева контрактов.

Порядок значим только для устойчивости вывода: домен обязан лежать РОВНО под одним корнем, и `ResolveDomain` возвращает первый совпавший. Два корня, несущие домен с одним именем, — находка дерева, а не случай, который этот пакет обязан разрешать. Третий корень — `corelib` — это НЕЙТРАЛЬНЫЙ дом словаря аннотаций доступа (`corelib.authz.v1`, решение владельца Р12, задача #2089). Домена под ним нет и не предполагается: `CloudDirs` вернёт только существующие каталоги, поэтому резолв домена он не расширяет. Он нужен здесь потому, что читатели этого перечня спрашивают не только «где домен», но и «НАШ ли это пакет»: без него нейтральный словарь в собственном дереве судился бы как чужой код.

Functions

func CloudDirs

func CloudDirs(protoDir string) []string

CloudDirs — существующие каталоги `<protoDir>/<корень>/cloud`. Возвращает только те, что есть на диске: корень, объявленный и не заведённый, популяцию не расширяет и обход не роняет.

func DomainRoots

func DomainRoots(protoDir string) []string

DomainRoots — корни, под которыми ДЕЙСТВИТЕЛЬНО лежит дерево доменов (`<корень>/cloud`). Выводится из CloudDirs, а не выписывается вторым списком.

Существует ради обходчиков, которым нужен относительный префикс, а не путь на диске. Прежде они шли по Roots напрямую и склеивали `proto/<корень>/cloud`, молча полагая, что домены есть у КАЖДОГО корня. Полагание было верно, пока корни были только доменными, и отказало на первом же нейтральном корне (`corelib`, задача #2089): обходчик падал на несуществующем каталоге. Место, где «корень без доменов законен», объявлено ОДНО — здесь, — иначе каждый обходчик заводил бы свою проверку и они разошлись бы молча.

ПУСТОЙ ОТВЕТ — НАХОДКА ВЫЗЫВАЮЩЕГО, а не повод продолжить: ноль доменных корней означает, что дерева контрактов нет вовсе. Пакет за вызывающего этого не решает — ронять прогон обязан он сам.

func Domains

func Domains(protoDir string) []string

Domains — имена деревьев доменов под всеми объявленными корнями.

func HasAnyPrefix

func HasAnyPrefix(s string, prefixes []string) bool

HasAnyPrefix — начинается ли s с приставки какого-нибудь объявленного корня.

Существует ради вызывающих, которые прежде писали `strings.HasPrefix(s, "kacho.")`. Литерал был верен, пока корень был один, и после появления второго перестал НАХОДИТЬ дерево второго корня — не покраснел и не позеленел, а замолчал.

func NamePrefixes

func NamePrefixes() []string

NamePrefixes — корни в форме приставки ПОЛНОГО ИМЕНИ (`kacho.`, `kaname.`).

Отдельно от PackagePrefixes: не всякий контракт дерева лежит под `<корень>.cloud.` — каталог прав объявлен как `kacho.iam.authz.catalog.v1`. Отбор по `.cloud.` оставил бы его вне популяции, и это было бы МОЛЧАНИЕ, а не находка.

func PackageOf

func PackageOf(protoDir, domain string) (string, bool)

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

func ResolveDomain(protoDir, domain string) (root, dir string, ok bool)

ResolveDomain — корень и каталог, под которым лежит дерево домена. ok=false означает, что домена нет НИ ПОД ОДНИМ объявленным корнем: это находка вызывающего, а не повод молча продолжить с пустой популяцией.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL