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  }