Documentation
¶
Overview ¶
Package mappings owns the declarative repository → Slack-channel configuration: parsing mappings.yaml, the in-memory Provider used at runtime, and the mappings.lock cache that records which entries have been validated. The package replaces the database-backed RepoMappings store.
Index ¶
Constants ¶
const ChannelMention = "<!channel>"
ChannelMention is the Slack wire token used when an entry omits the `mentions:` key — operators see `@channel` in Slack.
const LockFileComment = "DO NOT EDIT — regenerated by notifycat on validation"
LockFileComment is the human-facing warning baked into every written lock.
const LockVersion = 1
LockVersion is the current lock-file schema version.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Diff ¶
Diff is the result of DiffEntries: entries needing validation + lock keys that should be dropped on the next write.
func DiffEntries ¶
DiffEntries compares the current entries against the lock and returns which entries need validation (new or hash-changed) and which lock keys are stale (present in the lock but not in the file).
type Entry ¶
type Entry struct {
Org string
Repo string // empty when Wildcard is true
Wildcard bool
Channel string
Mentions []string
}
Entry is one validation unit: an explicit (org, repo) pair or an (org, "*") wildcard. Each entry has its own hash in mappings.lock.
func (Entry) Hash ¶
Hash is the cache key for an entry: sha256 over canonical JSON of the validation-relevant fields. Mentions are deliberately excluded — they only affect message formatting at Slack-send time, not anything the validator checks (channel membership, bot scopes, webhook events). A mention edit shouldn't invalidate the entry's cache.
type File ¶
File is the parsed mappings.yaml document.
type Lock ¶
type Lock struct {
Comment string `json:"_comment,omitempty"`
Version int `json:"version"`
Entries map[string]LockEntry `json:"entries"`
}
Lock is the on-disk validation cache.
type Org ¶
type Org struct {
Channel string
Mentions []string
MentionsPresent bool
Repositories Repositories
}
Org is one organization's mapping: every configured repository in the org shares this channel and mentions list. MentionsPresent distinguishes the absent-key case (fall back to @channel at lookup time) from `mentions: []` (ping nobody).
func (*Org) UnmarshalYAML ¶
UnmarshalYAML walks the mapping node by hand so we can:
- distinguish a missing `mentions:` key from `mentions: []`,
- reject explicit `mentions: null` (ambiguous; operators should remove the key or use `[]`),
- keep KnownFields-style rejection of unknown keys.
type Provider ¶
type Provider struct {
// contains filtered or unexported fields
}
Provider serves repository → mapping lookups from a parsed mappings.yaml. Construct with Load; safe for concurrent reads (no mutation after Load).
type Repositories ¶
Repositories is "*" (whole org) XOR a non-empty list of bare repo names. The YAML accepts either shape; the in-memory representation normalizes.
func (*Repositories) UnmarshalYAML ¶
func (r *Repositories) UnmarshalYAML(node *yaml.Node) error
UnmarshalYAML decodes either the wildcard string "*" or a list of repo names. "*" inside a list, an empty list, or any other shape is rejected.