gear_core/message/
init.rs1use crate::{
20 buffer::Payload,
21 ids::{ActorId, CodeId, MessageId, prelude::*},
22 message::{
23 Dispatch, DispatchKind, GasLimit, Message, Packet, Salt, StoredDispatch, StoredMessage,
24 Value,
25 },
26};
27
28#[derive(Clone, Debug, PartialEq, Eq)]
31pub struct InitMessage {
32 id: MessageId,
34 destination: ActorId,
36 payload: Payload,
38 gas_limit: Option<GasLimit>,
40 value: Value,
42}
43
44impl InitMessage {
45 pub fn from_packet(id: MessageId, packet: InitPacket) -> Self {
47 Self {
48 id,
49 destination: packet.program_id,
50 payload: packet.payload,
51 gas_limit: packet.gas_limit,
52 value: packet.value,
53 }
54 }
55
56 pub fn into_message(self, source: ActorId) -> Message {
58 Message::new(
59 self.id,
60 source,
61 self.destination,
62 self.payload,
63 self.gas_limit,
64 self.value,
65 None,
66 )
67 }
68
69 pub fn into_stored(self, source: ActorId) -> StoredMessage {
71 self.into_message(source).into_stored()
72 }
73
74 pub fn into_dispatch(self, source: ActorId) -> Dispatch {
76 Dispatch::new(DispatchKind::Init, self.into_message(source))
77 }
78
79 pub fn into_stored_dispatch(self, source: ActorId) -> StoredDispatch {
81 self.into_dispatch(source).into_stored()
82 }
83
84 pub fn id(&self) -> MessageId {
86 self.id
87 }
88
89 pub fn destination(&self) -> ActorId {
91 self.destination
92 }
93
94 pub fn payload_bytes(&self) -> &[u8] {
96 &self.payload
97 }
98
99 pub fn gas_limit(&self) -> Option<GasLimit> {
101 self.gas_limit
102 }
103
104 pub fn value(&self) -> Value {
106 self.value
107 }
108}
109
110#[derive(Clone, Debug, PartialEq, Eq)]
115#[cfg_attr(any(feature = "mock", test), derive(Default))]
116pub struct InitPacket {
117 program_id: ActorId,
119 code_id: CodeId,
121 salt: Salt,
123 payload: Payload,
125 gas_limit: Option<GasLimit>,
127 value: Value,
129}
130
131impl InitPacket {
132 pub fn new_from_user(
134 code_id: CodeId,
135 salt: Salt,
136 payload: Payload,
137 gas_limit: GasLimit,
138 value: Value,
139 ) -> Self {
140 Self {
141 program_id: ActorId::generate_from_user(code_id, &salt),
142 code_id,
143 salt,
144 payload,
145 gas_limit: Some(gas_limit),
146 value,
147 }
148 }
149
150 pub fn new_from_program(
152 code_id: CodeId,
153 salt: Salt,
154 payload: Payload,
155 message_id: MessageId,
156 gas_limit: Option<GasLimit>,
157 value: Value,
158 ) -> Self {
159 Self {
160 program_id: ActorId::generate_from_program(message_id, code_id, &salt),
161 code_id,
162 salt,
163 payload,
164 gas_limit,
165 value,
166 }
167 }
168
169 pub fn destination(&self) -> ActorId {
171 self.program_id
172 }
173
174 pub fn code_id(&self) -> CodeId {
176 self.code_id
177 }
178
179 pub fn salt(&self) -> &[u8] {
181 &self.salt
182 }
183}
184
185impl Packet for InitPacket {
186 fn payload_bytes(&self) -> &[u8] {
187 &self.payload
188 }
189
190 fn payload_len(&self) -> u32 {
191 self.payload.len_u32()
192 }
193
194 fn gas_limit(&self) -> Option<GasLimit> {
195 self.gas_limit
196 }
197
198 fn value(&self) -> Value {
199 self.value
200 }
201
202 fn kind() -> DispatchKind {
203 DispatchKind::Init
204 }
205}