use crate::{
ids::{MessageId, ProgramId},
message::{
common::MessageDetails, ContextStore, DispatchKind, GasLimit, Payload, StoredDispatch,
StoredMessage, Value,
},
};
use core::ops::Deref;
use scale_info::{
scale::{Decode, Encode},
TypeInfo,
};
#[derive(Clone, Default, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Decode, Encode, TypeInfo)]
pub struct IncomingMessage {
id: MessageId,
source: ProgramId,
payload: Payload,
gas_limit: GasLimit,
value: Value,
details: Option<MessageDetails>,
}
impl IncomingMessage {
pub fn new(
id: MessageId,
source: ProgramId,
payload: Payload,
gas_limit: GasLimit,
value: Value,
details: Option<MessageDetails>,
) -> Self {
Self {
id,
source,
payload,
gas_limit,
value,
details,
}
}
pub fn into_stored(self, destination: ProgramId) -> StoredMessage {
StoredMessage::new(
self.id,
self.source,
destination,
self.payload,
self.value,
self.details,
)
}
pub fn id(&self) -> MessageId {
self.id
}
pub fn source(&self) -> ProgramId {
self.source
}
pub fn payload_bytes(&self) -> &[u8] {
self.payload.inner()
}
pub fn payload_mut(&mut self) -> &mut Payload {
&mut self.payload
}
pub fn gas_limit(&self) -> GasLimit {
self.gas_limit
}
pub fn value(&self) -> Value {
self.value
}
pub fn details(&self) -> Option<MessageDetails> {
self.details
}
pub fn is_error_reply(&self) -> bool {
self.details.map(|d| d.is_error_reply()).unwrap_or(false)
}
pub fn is_reply(&self) -> bool {
self.details.map(|d| d.is_reply_details()).unwrap_or(false)
}
}
#[derive(Clone, Default, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Decode, Encode, TypeInfo)]
pub struct IncomingDispatch {
kind: DispatchKind,
message: IncomingMessage,
context: Option<ContextStore>,
}
impl From<IncomingDispatch> for (DispatchKind, IncomingMessage, Option<ContextStore>) {
fn from(dispatch: IncomingDispatch) -> (DispatchKind, IncomingMessage, Option<ContextStore>) {
(dispatch.kind, dispatch.message, dispatch.context)
}
}
impl IncomingDispatch {
pub fn new(
kind: DispatchKind,
message: IncomingMessage,
context: Option<ContextStore>,
) -> Self {
Self {
kind,
message,
context,
}
}
pub fn into_stored(self, destination: ProgramId, context: ContextStore) -> StoredDispatch {
StoredDispatch::new(
self.kind,
self.message.into_stored(destination),
Some(context),
)
}
pub fn into_parts(self) -> (DispatchKind, IncomingMessage, Option<ContextStore>) {
self.into()
}
pub fn kind(&self) -> DispatchKind {
self.kind
}
pub fn message(&self) -> &IncomingMessage {
&self.message
}
pub fn context(&self) -> &Option<ContextStore> {
&self.context
}
pub fn context_mut(&mut self) -> &mut Option<ContextStore> {
&mut self.context
}
}
impl Deref for IncomingDispatch {
type Target = IncomingMessage;
fn deref(&self) -> &Self::Target {
self.message()
}
}