37 lines
997 B
Go
37 lines
997 B
Go
package agentbinding
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Resolver struct{ bindings map[string]string }
|
|
|
|
func New(rawJSON string) (*Resolver, error) {
|
|
bindings := map[string]string{}
|
|
if err := json.Unmarshal([]byte(rawJSON), &bindings); err != nil {
|
|
return nil, fmt.Errorf("decode DOBOTAI_AGENT_BINDINGS: %w", err)
|
|
}
|
|
for key, value := range bindings {
|
|
if strings.TrimSpace(key) == "" || strings.TrimSpace(value) == "" {
|
|
return nil, errors.New("agent binding keys and values must be non-empty")
|
|
}
|
|
}
|
|
return &Resolver{bindings: bindings}, nil
|
|
}
|
|
|
|
func (r *Resolver) Resolve(channel, externalChatID string) (string, error) {
|
|
if r == nil {
|
|
return "", errors.New("agent resolver is not configured")
|
|
}
|
|
if agentID := r.bindings[channel+":"+externalChatID]; agentID != "" {
|
|
return agentID, nil
|
|
}
|
|
if agentID := r.bindings[channel+":*"]; agentID != "" {
|
|
return agentID, nil
|
|
}
|
|
return "", fmt.Errorf("no agent binding for %s:%s", channel, externalChatID)
|
|
}
|