Files

42 lines
1.2 KiB
Go

package main
import (
"strings"
"unicode"
)
// responsive kinds: how an addressed crow may answer a request (must-respond).
var responsiveKind = map[string]bool{"claim": true, "deliver": true, "decline": true}
// parseAddressing finds the first @handle in text that names one of members.
// An unknown handle stays literal text and yields "" (no address).
func parseAddressing(text string, members []string) string {
for _, tok := range strings.Fields(text) {
if !strings.HasPrefix(tok, "@") {
continue
}
name := strings.TrimFunc(tok[1:], func(r rune) bool { return !unicode.IsLetter(r) && !unicode.IsDigit(r) })
for _, m := range members {
if strings.EqualFold(name, m) {
return m
}
}
}
return ""
}
// splitKind pulls a leading "KIND: x" line off a crow's raw reply and returns
// the lowercased kind word ("" if absent) and the remaining body.
func splitKind(text string) (kind, body string) {
trimmed := strings.TrimLeft(text, " \t\n")
i := strings.IndexByte(trimmed, '\n')
first, rest := trimmed, ""
if i >= 0 {
first, rest = trimmed[:i], strings.TrimSpace(trimmed[i+1:])
}
if len(first) >= 5 && strings.EqualFold(first[:5], "KIND:") {
return strings.ToLower(strings.TrimSpace(first[5:])), rest
}
return "", text
}