github.com/datachainlab/cross@v0.2.2/x/packets/types.go (about)

     1  package packets
     2  
     3  import (
     4  	sptypes "github.com/bluele/interchain-simple-packet/types"
     5  	"github.com/cosmos/cosmos-sdk/codec"
     6  	"github.com/cosmos/ibc-go/modules/core/exported"
     7  	"github.com/datachainlab/cross/x/utils"
     8  	"github.com/gogo/protobuf/proto"
     9  )
    10  
    11  type (
    12  	Header                    = sptypes.Header
    13  	PacketData                = sptypes.PacketData
    14  	PacketAcknowledgementData = PacketData
    15  )
    16  
    17  // NewPacketData returns a new packet data
    18  func NewPacketData(h *Header, payload PacketDataPayload) PacketData {
    19  	if h == nil {
    20  		h = &Header{}
    21  	}
    22  	any, err := utils.PackAny(payload)
    23  	if err != nil {
    24  		panic(err)
    25  	}
    26  	return sptypes.NewSimplePacketData(*h, any)
    27  }
    28  
    29  // PacketDataPayload defines the interface of packet data's payload
    30  type PacketDataPayload interface {
    31  	proto.Message
    32  	Type() string
    33  	ValidateBasic() error
    34  }
    35  
    36  // PacketAcknowledgementPayload defines the interface of packet ack's payload
    37  type PacketAcknowledgementPayload interface {
    38  	proto.Message
    39  	Type() string
    40  	ValidateBasic() error
    41  }
    42  
    43  // IncomingPacket defines the interface of incoming packet
    44  type IncomingPacket interface {
    45  	exported.PacketI
    46  	PacketData() PacketData
    47  	Header() Header
    48  	Payload() PacketDataPayload
    49  }
    50  
    51  func UnmarshalIncomingPacket(m codec.Codec, raw exported.PacketI) (IncomingPacket, error) {
    52  	var pd PacketData
    53  	var payload PacketDataPayload
    54  	if err := proto.Unmarshal(raw.GetData(), &pd); err != nil {
    55  		return nil, err
    56  	}
    57  	if err := m.UnpackAny(pd.GetPayload(), &payload); err != nil {
    58  		return nil, err
    59  	}
    60  	return NewIncomingPacket(raw, pd, payload), nil
    61  }
    62  
    63  var _ IncomingPacket = (*incomingPacket)(nil)
    64  
    65  type incomingPacket struct {
    66  	exported.PacketI
    67  	packetData PacketData
    68  	payload    PacketDataPayload
    69  }
    70  
    71  // NewIncomingPacket returns a new IncomingPacket
    72  func NewIncomingPacket(raw exported.PacketI, packetData PacketData, payload PacketDataPayload) IncomingPacket {
    73  	return &incomingPacket{
    74  		PacketI:    raw,
    75  		packetData: packetData,
    76  		payload:    payload,
    77  	}
    78  }
    79  
    80  // PacketData implements IncomingPacket.PacketData
    81  func (p incomingPacket) PacketData() PacketData {
    82  	return p.packetData
    83  }
    84  
    85  // Header implements IncomingPacket.Header
    86  func (p incomingPacket) Header() Header {
    87  	return p.packetData.Header
    88  }
    89  
    90  // Payload implements IncomingPacket.Payload
    91  func (p incomingPacket) Payload() PacketDataPayload {
    92  	return p.payload
    93  }
    94  
    95  // OutgoingPacket defines the interface of outgoing packet
    96  type OutgoingPacket interface {
    97  	IncomingPacket
    98  	SetPacketData(header Header, payload PacketDataPayload)
    99  }
   100  
   101  var _ OutgoingPacket = (*outgoingPacket)(nil)
   102  
   103  type outgoingPacket struct {
   104  	exported.PacketI
   105  	packetData PacketData
   106  	payload    PacketDataPayload
   107  }
   108  
   109  // NewOutgoingPacket returns a new OutgoingPacket
   110  func NewOutgoingPacket(raw exported.PacketI, packetData PacketData, payload PacketDataPayload) OutgoingPacket {
   111  	return &outgoingPacket{
   112  		PacketI:    raw,
   113  		packetData: packetData,
   114  		payload:    payload,
   115  	}
   116  }
   117  
   118  // PacketData implements Outgoing.PacketData
   119  func (p outgoingPacket) PacketData() PacketData {
   120  	return p.packetData
   121  }
   122  
   123  // Header implements Outgoing.Header
   124  func (p outgoingPacket) Header() Header {
   125  	return p.packetData.Header
   126  }
   127  
   128  // Payload implements Outgoing.Payload
   129  func (p outgoingPacket) Payload() PacketDataPayload {
   130  	return p.payload
   131  }
   132  
   133  // SetPacketData implements Outgoing.SetPacketData
   134  func (p *outgoingPacket) SetPacketData(header Header, payload PacketDataPayload) {
   135  	p.payload = payload
   136  	p.packetData = NewPacketData(&header, payload)
   137  }
   138  
   139  // GetData implements Outgoing.GetData
   140  func (p outgoingPacket) GetData() []byte {
   141  	bz, err := proto.Marshal(&p.packetData)
   142  	if err != nil {
   143  		panic(err)
   144  	}
   145  	return bz
   146  }
   147  
   148  // NewPacketAcknowledgementData returns a new PacketAcknowledgementData
   149  func NewPacketAcknowledgementData(h *Header, payload PacketAcknowledgementPayload) PacketAcknowledgementData {
   150  	if h == nil {
   151  		h = new(Header)
   152  	}
   153  	any, err := utils.PackAny(payload)
   154  	if err != nil {
   155  		panic(err)
   156  	}
   157  	return PacketAcknowledgementData{
   158  		Header:  *h,
   159  		Payload: any,
   160  	}
   161  }
   162  
   163  // IncomingPacketAcknowledgement defines the interface of incoming packet acknowledgement
   164  type IncomingPacketAcknowledgement interface {
   165  	Data() PacketAcknowledgementData
   166  	Header() Header
   167  	Payload() PacketAcknowledgementPayload
   168  }
   169  
   170  type incomingPacketAcknowledgement struct {
   171  	data    PacketAcknowledgementData
   172  	payload PacketAcknowledgementPayload
   173  }
   174  
   175  var _ IncomingPacketAcknowledgement = (*incomingPacketAcknowledgement)(nil)
   176  
   177  // NewIncomingPacketAcknowledgement returns a new IncomingPacketAcknowledgement
   178  func NewIncomingPacketAcknowledgement(h *Header, payload PacketAcknowledgementPayload) IncomingPacketAcknowledgement {
   179  	return incomingPacketAcknowledgement{data: NewPacketAcknowledgementData(h, payload), payload: payload}
   180  }
   181  
   182  // Data implements IncomingPacketAcknowledgement.Data
   183  func (a incomingPacketAcknowledgement) Data() PacketAcknowledgementData {
   184  	return a.data
   185  }
   186  
   187  // Header implements IncomingPacketAcknowledgement.Header
   188  func (a incomingPacketAcknowledgement) Header() Header {
   189  	return a.data.Header
   190  }
   191  
   192  // Payload implements IncomingPacketAcknowledgement.Payload
   193  func (a incomingPacketAcknowledgement) Payload() PacketAcknowledgementPayload {
   194  	return a.payload
   195  }
   196  
   197  func UnmarshalIncomingPacketAcknowledgement(m codec.Codec, ack []byte) (IncomingPacketAcknowledgement, error) {
   198  	var pd PacketAcknowledgementData
   199  	var payload PacketAcknowledgementPayload
   200  
   201  	if err := proto.Unmarshal(ack, &pd); err != nil {
   202  		return nil, err
   203  	}
   204  	if err := m.UnpackAny(pd.GetPayload(), &payload); err != nil {
   205  		return nil, err
   206  	}
   207  
   208  	return NewIncomingPacketAcknowledgement(&pd.Header, payload), nil
   209  }
   210  
   211  // OutgoingPacketAcknowledgement defines the interface of outgoing packet acknowledgement
   212  type OutgoingPacketAcknowledgement interface {
   213  	IncomingPacketAcknowledgement
   214  	SetData(header Header, payload PacketAcknowledgementPayload)
   215  }
   216  
   217  type outgoingPacketAcknowledgement struct {
   218  	data    PacketAcknowledgementData
   219  	payload PacketAcknowledgementPayload
   220  }
   221  
   222  // NewOutgoingPacketAcknowledgement returns a new OutgoingPacketAcknowledgement
   223  func NewOutgoingPacketAcknowledgement(h *Header, payload PacketAcknowledgementPayload) OutgoingPacketAcknowledgement {
   224  	return &outgoingPacketAcknowledgement{
   225  		data:    NewPacketAcknowledgementData(h, payload),
   226  		payload: payload,
   227  	}
   228  }
   229  
   230  var _ OutgoingPacketAcknowledgement = (*outgoingPacketAcknowledgement)(nil)
   231  
   232  // Data implements OutgoingPacketAcknowledgement.Data
   233  func (a outgoingPacketAcknowledgement) Data() PacketAcknowledgementData {
   234  	return a.data
   235  }
   236  
   237  // Header implements OutgoingPacketAcknowledgement.Header
   238  func (a outgoingPacketAcknowledgement) Header() Header {
   239  	return a.data.Header
   240  }
   241  
   242  // Payload implements OutgoingPacketAcknowledgement.Payload
   243  func (a outgoingPacketAcknowledgement) Payload() PacketAcknowledgementPayload {
   244  	return a.payload
   245  }
   246  
   247  // Payload implements OutgoingPacketAcknowledgement.SetData
   248  func (a outgoingPacketAcknowledgement) SetData(header Header, payload PacketAcknowledgementPayload) {
   249  	a.data = NewPacketAcknowledgementData(&header, payload)
   250  	a.payload = payload
   251  }