+ message, err := parsePayload[T](address, data, retained)
+ if err != nil {
+ return Message[T]{}, fmt.Errorf("parse payload: %w", err)
+ }
+
+ return message, nil
+}
+
+func eraseMessage[T any](message Message[T], err error) (Message[any], error) {
+ if err != nil {
+ return Message[any]{}, fmt.Errorf("parse message: %w", err)
+ }
+
+ return Message[any]{
+ Address: message.Address,
+ Metadata: message.Metadata,
+ Payload: message.Payload,
+ Retained: message.Retained,
+ }, nil
+}
+
+func parsePayload[T any](address Address, data []byte, retained bool) (Message[T], error) {
+ kind := address.Kind
+