Files
sendico/api/pkg/discovery/keys.go
2026-01-04 12:57:40 +01:00

100 lines
2.0 KiB
Go

package discovery
import "strings"
const kvEntryPrefix = "entry."
func registryEntryKey(entry RegistryEntry) string {
return registryKey(entry.Service, entry.Rail, entry.Network, entry.Operations, entry.Version, entry.InstanceID)
}
func registryKey(service, rail, network string, operations []string, version, instanceID string) string {
service = normalizeKeyPart(service)
rail = normalizeKeyPart(rail)
op := normalizeKeyPart(firstOperation(operations))
version = normalizeKeyPart(version)
instanceID = normalizeKeyPart(instanceID)
if instanceID == "" {
return ""
}
if service == "" {
service = "service"
}
if rail == "" {
rail = "none"
}
if op == "" {
op = "none"
}
if version == "" {
version = "unknown"
}
parts := []string{service, rail, op, version, instanceID}
if network != "" {
netPart := normalizeKeyPart(network)
if netPart != "" {
parts = append(parts, netPart)
}
}
return strings.Join(parts, ".")
}
func kvKeyFromRegistryKey(key string) string {
key = strings.TrimSpace(key)
if key == "" {
return ""
}
if strings.HasPrefix(key, kvEntryPrefix) {
return key
}
return kvEntryPrefix + key
}
func registryKeyFromKVKey(key string) string {
key = strings.TrimSpace(key)
if strings.HasPrefix(key, kvEntryPrefix) {
return strings.TrimPrefix(key, kvEntryPrefix)
}
return key
}
func firstOperation(ops []string) string {
for _, op := range ops {
op = strings.TrimSpace(op)
if op != "" {
return op
}
}
return ""
}
func normalizeKeyPart(value string) string {
value = strings.ToLower(strings.TrimSpace(value))
if value == "" {
return ""
}
var b strings.Builder
b.Grow(len(value))
lastDash := false
for _, r := range value {
if (r >= 'a' && r <= 'z') || (r >= '0' && r <= '9') {
b.WriteRune(r)
lastDash = false
continue
}
if r == '-' || r == '_' {
if !lastDash {
b.WriteByte('-')
lastDash = true
}
continue
}
if !lastDash {
b.WriteByte('-')
lastDash = true
}
}
out := strings.Trim(b.String(), "-")
return out
}