package bus import ( "context" "strings" "github.com/pkg/errors" ) type ( MessageNamespace string Address string Message any ) type Envelope interface { Message() any Context() context.Context Address() Address } type BaseEnvelope struct { msg Message ctx context.Context addr Address } func NewEnvelope(ctx context.Context, addr Address, msg Message) *BaseEnvelope { return &BaseEnvelope{ ctx: ctx, addr: addr, msg: msg, } } func NewMessageNamespace(namespaces ...MessageNamespace) MessageNamespace { var sb strings.Builder for i, ns := range namespaces { if i != 0 { if _, err := sb.WriteString(":"); err != nil { panic(errors.Wrap(err, "could not build new message namespace")) } } if _, err := sb.WriteString(string(ns)); err != nil { panic(errors.Wrap(err, "could not build new message namespace")) } } return MessageNamespace(sb.String()) }