188 lines
4.8 KiB
Go

package protowire
import (
"github.com/kaspanet/kaspad/app/appmessage"
"github.com/pkg/errors"
)
type converter interface {
toAppMessage() (appmessage.Message, error)
}
// ToAppMessage converts a KaspadMessage to its appmessage.Message representation
func (x *KaspadMessage) ToAppMessage() (appmessage.Message, error) {
return x.Payload.(converter).toAppMessage()
}
// FromAppMessage creates a KaspadMessage from a appmessage.Message
func FromAppMessage(message appmessage.Message) (*KaspadMessage, error) {
payload, err := toPayload(message)
if err != nil {
return nil, err
}
return &KaspadMessage{
Payload: payload,
}, nil
}
func toPayload(message appmessage.Message) (isKaspadMessage_Payload, error) {
switch message := message.(type) {
case *appmessage.MsgAddresses:
payload := new(KaspadMessage_Addresses)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgBlock:
payload := new(KaspadMessage_Block)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestBlockLocator:
payload := new(KaspadMessage_RequestBlockLocator)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgBlockLocator:
payload := new(KaspadMessage_BlockLocator)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestAddresses:
payload := new(KaspadMessage_RequestAddresses)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestIBDBlocks:
payload := new(KaspadMessage_RequestIBDBlocks)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestNextIBDBlocks:
payload := new(KaspadMessage_RequestNextIBDBlocks)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgDoneIBDBlocks:
payload := new(KaspadMessage_DoneIBDBlocks)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestRelayBlocks:
payload := new(KaspadMessage_RequestRelayBlocks)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestSelectedTip:
payload := new(KaspadMessage_RequestSelectedTip)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgRequestTransactions:
payload := new(KaspadMessage_RequestTransactions)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgTransactionNotFound:
payload := new(KaspadMessage_TransactionNotFound)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgIBDBlock:
payload := new(KaspadMessage_IbdBlock)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgInvRelayBlock:
payload := new(KaspadMessage_InvRelayBlock)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgInvTransaction:
payload := new(KaspadMessage_InvTransactions)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgPing:
payload := new(KaspadMessage_Ping)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgPong:
payload := new(KaspadMessage_Pong)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgSelectedTip:
payload := new(KaspadMessage_SelectedTip)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgTx:
payload := new(KaspadMessage_Transaction)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgVerAck:
payload := new(KaspadMessage_Verack)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgVersion:
payload := new(KaspadMessage_Version)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
case *appmessage.MsgReject:
payload := new(KaspadMessage_Reject)
err := payload.fromAppMessage(message)
if err != nil {
return nil, err
}
return payload, nil
default:
return nil, errors.Errorf("unknown message type %T", message)
}
}