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 }