use crate::{
ids::{MessageId, ProgramId},
message::{
Dispatch, DispatchKind, GasLimit, Message, Packet, Payload, StoredDispatch, StoredMessage,
Value,
},
};
use scale_info::{
scale::{Decode, Encode},
TypeInfo,
};
use super::PayloadSizeError;
#[derive(Clone, Default, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Decode, Encode, TypeInfo)]
pub struct HandleMessage {
id: MessageId,
destination: ProgramId,
payload: Payload,
gas_limit: Option<GasLimit>,
value: Value,
}
impl HandleMessage {
pub fn from_packet(id: MessageId, packet: HandlePacket) -> Self {
Self {
id,
destination: packet.destination,
payload: packet.payload,
gas_limit: packet.gas_limit,
value: packet.value,
}
}
pub fn into_message(self, source: ProgramId) -> Message {
Message::new(
self.id,
source,
self.destination,
self.payload,
self.gas_limit,
self.value,
None,
)
}
pub fn into_stored(self, source: ProgramId) -> StoredMessage {
self.into_message(source).into()
}
pub fn into_dispatch(self, source: ProgramId) -> Dispatch {
Dispatch::new(DispatchKind::Handle, self.into_message(source))
}
pub fn into_stored_dispatch(self, source: ProgramId) -> StoredDispatch {
self.into_dispatch(source).into()
}
pub fn id(&self) -> MessageId {
self.id
}
pub fn destination(&self) -> ProgramId {
self.destination
}
pub fn payload_bytes(&self) -> &[u8] {
self.payload.inner()
}
pub fn gas_limit(&self) -> Option<GasLimit> {
self.gas_limit
}
pub fn value(&self) -> Value {
self.value
}
}
#[derive(Clone, Default, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Decode, Encode, TypeInfo)]
pub struct HandlePacket {
destination: ProgramId,
payload: Payload,
gas_limit: Option<GasLimit>,
value: Value,
}
impl HandlePacket {
pub fn new(destination: ProgramId, payload: Payload, value: Value) -> Self {
Self {
destination,
payload,
gas_limit: None,
value,
}
}
pub fn new_with_gas(
destination: ProgramId,
payload: Payload,
gas_limit: GasLimit,
value: Value,
) -> Self {
Self {
destination,
payload,
gas_limit: Some(gas_limit),
value,
}
}
pub(super) fn try_prepend(&mut self, data: Payload) -> Result<(), PayloadSizeError> {
self.payload.try_prepend(data)
}
pub fn destination(&self) -> ProgramId {
self.destination
}
}
impl Packet for HandlePacket {
fn payload_bytes(&self) -> &[u8] {
self.payload.inner()
}
fn gas_limit(&self) -> Option<GasLimit> {
self.gas_limit
}
fn value(&self) -> Value {
self.value
}
}