package catalogue import ( "fmt" "path" "strings" ) // Item is one item a module contributes to a collection: its template in the module's repository, or, in the // manifest the mesh holds, the template's text, read back from the build's templates archive like a file's. // // **Attributes, a capability and a name** (design 57 L3, issue 777): an item may carry `attributes` (string keys and // values; `order`, a whole number 0–99 defaulting to 50, orders the items of one placeholder) and `if-capability`, // the capability a machine must report for the item to be placed on it. A module may give several items to one // collection, each then with a `name` unique within the module and the collection. A collector takes only the items // whose attributes match, `${collected::=,…}`, and all of them without the selector. type Item struct { Collection string `json:"collection"` Name string `json:"name,omitempty"` Template string `json:"template,omitempty"` Content string `json:"content,omitempty"` Attributes map[string]string `json:"attributes,omitempty"` IfCapability string `json:"if-capability,omitempty"` } // ItemKey is an item's key among its module's: the collection, and `/` for a named item. func ItemKey(collection, name string) string { if name == "" { return collection } return collection + "/" + name } func (it Item) key() string { return ItemKey(it.Collection, it.Name) } // OrderAttribute is the attribute that orders items. const OrderAttribute = "order" // Collection is one collection a module collects, and the comment its tool writes a line in: each contributor's item // is introduced by ` `, and by nothing without one. type Collection struct { Name string `json:"name"` Comment string `json:"comment,omitempty"` } // CollectedNamespace is a collection's placeholder namespace, `${collected:}`. const CollectedNamespace = "collected" // EnvironmentCollection is the one collection of the session environment (design 57 L3, issue 795): its items are // typed by attributes, a variable (`kind=variable`, `name`) or a PATH entry (`kind=path`, `at=start|end`), and the // template's text is the value or the entry. A collector names the rendering, `${collected:environment:posix}` or // `${collected:environment:systemd}`, which is not a selector. const EnvironmentCollection = "environment" // itemTemplateProblem is what is wrong with an item's template path, or "". func itemTemplateProblem(m Manifest, name string) string { dir := m.TemplatesDir() if strings.HasPrefix(name, "/") || path.Clean(name) != name || !strings.HasPrefix(name, dir+"/") || strings.Contains(name, "\\") { return fmt.Sprintf("the template %q is not a file under %s/ of its own repository: a template is %q, a "+ "plain relative path, and the build packs only %s/", name, dir, dir+"/", dir) } return "" }