package axon import ( "fmt" "github.com/vmihailenco/msgpack/v5" ) // MarshalEvent encodes an Event to MessagePack. Fields are encoded in the // canonical struct order using the msgpack struct tags. Binary fields (id, // pubkey, sig, content) are encoded as msgpack bin type ([]byte). func MarshalEvent(e *Event) ([]byte, error) { b, err := msgpack.Marshal(e) if err != nil { return nil, fmt.Errorf("axon: marshal event: %w", err) } return b, nil } // UnmarshalEvent decodes a MessagePack blob into an Event. func UnmarshalEvent(data []byte) (*Event, error) { var e Event if err := msgpack.Unmarshal(data, &e); err != nil { return nil, fmt.Errorf("axon: unmarshal event: %w", err) } return &e, nil } // MarshalMessage encodes a wire message as a msgpack array: [type, payload]. // messageType is a uint16; payload is any msgpack-serializable value. func MarshalMessage(messageType uint16, payload interface{}) ([]byte, error) { b, err := msgpack.Marshal([]interface{}{messageType, payload}) if err != nil { return nil, fmt.Errorf("axon: marshal message: %w", err) } return b, nil } // UnmarshalMessageType reads only the first element of a [type, payload] // msgpack array, returning the message type without decoding the payload. func UnmarshalMessageType(data []byte) (uint16, error) { var arr []msgpack.RawMessage if err := msgpack.Unmarshal(data, &arr); err != nil { return 0, fmt.Errorf("axon: unmarshal message: %w", err) } if len(arr) < 1 { return 0, fmt.Errorf("axon: message array is empty") } var t uint16 if err := msgpack.Unmarshal(arr[0], &t); err != nil { return 0, fmt.Errorf("axon: unmarshal message type: %w", err) } return t, nil }