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 }