tonlib_core/
message.rs

1mod error;
2pub use error::*;
3use lazy_static::lazy_static;
4use num_bigint::BigUint;
5use num_traits::Zero;
6
7mod common_msg_info;
8pub use common_msg_info::*;
9
10use crate::cell::{ArcCell, Cell};
11
12mod common;
13mod jetton;
14mod nft;
15mod sbt;
16mod transfer;
17pub use common::*;
18pub use jetton::*;
19pub use nft::*;
20pub use sbt::*;
21pub use transfer::*;
22
23lazy_static! {
24    pub(crate) static ref ZERO_COINS: BigUint = BigUint::zero();
25}
26
27pub trait TonMessage: Sized {
28    fn build(&self) -> Result<Cell, TonMessageError>;
29
30    fn parse(cell: &Cell) -> Result<Self, TonMessageError>;
31}
32
33pub trait HasOpcode: TonMessage {
34    fn verify_opcode(&self, opcode: u32) -> Result<(), TonMessageError> {
35        let expected_opcode = Self::opcode();
36        if opcode != expected_opcode {
37            let invalid = InvalidMessage {
38                opcode: Some(opcode),
39                query_id: Some(self.query_id()),
40                message: format!("Unexpected opcode.  {0:08x} expected", expected_opcode),
41            };
42            Err(TonMessageError::InvalidMessage(invalid))
43        } else {
44            Ok(())
45        }
46    }
47
48    fn with_query_id(&mut self, query_id: u64) -> &mut Self {
49        self.set_query_id(query_id);
50        self
51    }
52    fn set_query_id(&mut self, query_id: u64);
53
54    fn query_id(&self) -> u64;
55
56    fn opcode() -> u32;
57}
58
59impl TonMessage for Cell {
60    fn build(&self) -> Result<Cell, TonMessageError> {
61        Ok(self.clone())
62    }
63
64    fn parse(cell: &Cell) -> Result<Self, TonMessageError> {
65        Ok(cell.clone())
66    }
67}
68
69pub trait WithForwardPayload: TonMessage {
70    fn with_forward_payload(
71        &mut self,
72        forward_ton_amount: BigUint,
73        forward_payload: ArcCell,
74    ) -> &mut Self {
75        self.set_forward_payload(forward_payload, forward_ton_amount);
76        self
77    }
78
79    fn set_forward_payload(&mut self, forward_payload: ArcCell, forward_ton_amount: BigUint);
80}