github.com/wfusion/gofusion@v1.1.14/common/infra/watermill/components/cqrs/marshaler_json.go (about) 1 package cqrs 2 3 import ( 4 "github.com/wfusion/gofusion/common/infra/watermill/message" 5 "github.com/wfusion/gofusion/common/utils" 6 "github.com/wfusion/gofusion/common/utils/serialize/json" 7 ) 8 9 type JSONMarshaler struct { 10 NewUUID func() string 11 GenerateName func(v any) string 12 } 13 14 func (m JSONMarshaler) Marshal(v any) (*message.Message, error) { 15 b, err := json.Marshal(v) 16 if err != nil { 17 return nil, err 18 } 19 20 msg := message.NewMessage( 21 m.newUUID(), 22 b, 23 ) 24 msg.Metadata.Set("name", m.Name(v)) 25 26 return msg, nil 27 } 28 29 func (m JSONMarshaler) newUUID() string { 30 if m.NewUUID != nil { 31 return m.NewUUID() 32 } 33 34 // default 35 return utils.UUID() 36 } 37 38 func (JSONMarshaler) Unmarshal(msg *message.Message, v any) (err error) { 39 return json.Unmarshal(msg.Payload, v) 40 } 41 42 func (m JSONMarshaler) Name(cmdOrEvent any) string { 43 if m.GenerateName != nil { 44 return m.GenerateName(cmdOrEvent) 45 } 46 47 return FullyQualifiedStructName(cmdOrEvent) 48 } 49 50 func (m JSONMarshaler) NameFromMessage(msg *message.Message) string { 51 return msg.Metadata.Get("name") 52 }