gear_core/message/
incoming.rs1use crate::{
20 buffer::Payload,
21 ids::{ActorId, MessageId},
22 message::{
23 ContextStore, DispatchKind, GasLimit, StoredDispatch, StoredMessage, Value,
24 common::MessageDetails,
25 },
26};
27use alloc::sync::Arc;
28use core::ops::Deref;
29
30#[derive(Clone, Debug, PartialEq, Eq)]
34#[cfg_attr(any(feature = "mock", test), derive(Default))]
35pub struct IncomingMessage {
36 id: MessageId,
38 source: ActorId,
40 payload: Arc<Payload>,
42 gas_limit: GasLimit,
44 value: Value,
46 details: Option<MessageDetails>,
48}
49
50impl IncomingMessage {
51 pub fn new(
53 id: MessageId,
54 source: ActorId,
55 payload: Payload,
56 gas_limit: GasLimit,
57 value: Value,
58 details: Option<MessageDetails>,
59 ) -> Self {
60 Self {
61 id,
62 source,
63 gas_limit,
64 value,
65 details,
66 payload: Arc::new(payload),
67 }
68 }
69
70 pub fn into_stored(self, destination: ActorId) -> StoredMessage {
72 StoredMessage::new(
73 self.id,
74 self.source,
75 destination,
76 Arc::try_unwrap(self.payload).unwrap_or_else(|payload| {
77 log::error!(
78 "IncomingMessage payload has multiple references, this is unexpected behavior"
79 );
80 Arc::unwrap_or_clone(payload)
81 }),
82 self.value,
83 self.details,
84 )
85 }
86
87 pub fn payload(&self) -> Arc<Payload> {
89 self.payload.clone()
90 }
91
92 pub fn id(&self) -> MessageId {
94 self.id
95 }
96
97 pub fn source(&self) -> ActorId {
99 self.source
100 }
101
102 pub fn gas_limit(&self) -> GasLimit {
104 self.gas_limit
105 }
106
107 pub fn value(&self) -> Value {
109 self.value
110 }
111
112 pub fn details(&self) -> Option<MessageDetails> {
114 self.details
115 }
116
117 pub fn is_error_reply(&self) -> bool {
119 self.details.map(|d| d.is_error_reply()).unwrap_or(false)
120 }
121
122 pub fn is_reply(&self) -> bool {
124 self.details.map(|d| d.is_reply_details()).unwrap_or(false)
125 }
126}
127
128#[derive(Clone, Debug, PartialEq, Eq)]
130#[cfg_attr(any(feature = "mock", test), derive(Default))]
131pub struct IncomingDispatch {
132 kind: DispatchKind,
134 message: IncomingMessage,
136 context: Option<ContextStore>,
138}
139
140impl From<IncomingDispatch> for (DispatchKind, IncomingMessage, Option<ContextStore>) {
141 fn from(dispatch: IncomingDispatch) -> (DispatchKind, IncomingMessage, Option<ContextStore>) {
142 (dispatch.kind, dispatch.message, dispatch.context)
143 }
144}
145
146impl IncomingDispatch {
147 pub fn new(
149 kind: DispatchKind,
150 message: IncomingMessage,
151 context: Option<ContextStore>,
152 ) -> Self {
153 Self {
154 kind,
155 message,
156 context,
157 }
158 }
159
160 pub fn into_stored(self, destination: ActorId, context: ContextStore) -> StoredDispatch {
162 StoredDispatch::new(
163 self.kind,
164 self.message.into_stored(destination),
165 Some(context),
166 )
167 }
168
169 pub fn into_parts(self) -> (DispatchKind, IncomingMessage, Option<ContextStore>) {
171 self.into()
172 }
173
174 pub fn kind(&self) -> DispatchKind {
176 self.kind
177 }
178
179 pub fn message(&self) -> &IncomingMessage {
181 &self.message
182 }
183
184 pub fn context(&self) -> &Option<ContextStore> {
186 &self.context
187 }
188
189 pub fn context_mut(&mut self) -> &mut Option<ContextStore> {
191 &mut self.context
192 }
193}
194
195impl Deref for IncomingDispatch {
196 type Target = IncomingMessage;
197
198 fn deref(&self) -> &Self::Target {
199 self.message()
200 }
201}