43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
package catalogue
|
|
|
|
// SeatSays is whether a consumed `<seat>.<event>` names one of the seat's own events: the seat emits it,
|
|
// exactly or by one of its patterns (`log.*`). A consumed name whose emitter is a seat and whose event the
|
|
// seat does not emit is the event of the module of that name (novox/hq ADR 0239): mesh-delivery is a seat
|
|
// and the module holding it, and what the module says it says as itself, through the runtime that launches
|
|
// it — read as the seat's, a consumer would subscribe a subject nothing may publish.
|
|
func SeatSays(emits []string, event string) bool {
|
|
for _, e := range emits {
|
|
if e == event || topicMatches(e, event) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// topicMatches is whether an event's name matches a declared pattern, `*` one dot-separated segment and
|
|
// `>` or `**` the rest.
|
|
func topicMatches(pattern, event string) bool {
|
|
p, e := splitDots(pattern), splitDots(event)
|
|
for i, part := range p {
|
|
if part == ">" || part == "**" {
|
|
return len(e) > i
|
|
}
|
|
if i >= len(e) || (part != "*" && part != e[i]) {
|
|
return false
|
|
}
|
|
}
|
|
return len(p) == len(e)
|
|
}
|
|
|
|
func splitDots(s string) []string {
|
|
var out []string
|
|
start := 0
|
|
for i := 0; i < len(s); i++ {
|
|
if s[i] == '.' {
|
|
out = append(out, s[start:i])
|
|
start = i + 1
|
|
}
|
|
}
|
|
return append(out, s[start:])
|
|
}
|