github.com/TBD54566975/ftl@v0.219.0/internal/model/request_key.go (about) 1 package model 2 3 import ( 4 "fmt" 5 "regexp" 6 "strings" 7 ) 8 9 // A RequestKey represents an inbound request into the cluster. 10 type RequestKey = KeyType[RequestKeyPayload, *RequestKeyPayload] 11 12 func NewRequestKey(origin Origin, key string) RequestKey { 13 return newKey[RequestKeyPayload](string(origin), key) 14 } 15 16 func ParseRequestKey(name string) (RequestKey, error) { 17 return parseKey[RequestKeyPayload](name) 18 } 19 20 // Origin of a request. 21 type Origin string 22 23 const ( 24 OriginIngress Origin = "ingress" 25 OriginCron Origin = "cron" 26 OriginPubsub Origin = "pubsub" 27 ) 28 29 func ParseOrigin(origin string) (Origin, error) { 30 switch origin { 31 case "ingress": 32 return OriginIngress, nil 33 case "cron": 34 return OriginCron, nil 35 case "pubsub": 36 return OriginPubsub, nil 37 default: 38 return "", fmt.Errorf("unknown origin %q", origin) 39 } 40 } 41 42 var requestKeyNormaliserRe = regexp.MustCompile("[^a-zA-Z0-9]+") 43 44 type RequestKeyPayload struct { 45 Origin Origin 46 Key string 47 } 48 49 func (r *RequestKeyPayload) Kind() string { return "req" } 50 func (r *RequestKeyPayload) String() string { return fmt.Sprintf("%s-%s", r.Origin, r.Key) } 51 func (r *RequestKeyPayload) Parse(parts []string) error { 52 if len(parts) < 2 { 53 return fmt.Errorf("expected <origin>-<key> but got %q", strings.Join(parts, "-")) 54 } 55 origin, err := ParseOrigin(parts[0]) 56 if err != nil { 57 return err 58 } 59 r.Origin = origin 60 key := strings.Join(parts[1:], "-") 61 r.Key = requestKeyNormaliserRe.ReplaceAllString(key, "-") 62 return nil 63 } 64 func (r *RequestKeyPayload) RandomBytes() int { return 10 }