mesh/delivery-group group feat/sdk1 rejected: composed together: the checker's verdict at the members' heads (428d048dd50a): unit: git.novox.be/novox/mesh-sdk/…
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: unit: git.novox.be/novox/mesh-sdk/go/process.TestStatePutWritesAKeyWhole: a Put through a short blackout: 0, mesh-mail's state send…
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
65 lines
2.9 KiB
Go
65 lines
2.9 KiB
Go
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:<collection>:<k>=<v>,…}`, 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 `/<name>` 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 `<comment> <contributor>`, 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:<collection>}`.
|
||
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+"/<name>", dir)
|
||
}
|
||
return ""
|
||
}
|