use crate::clients::tl_client::tl::ser_de::serde_block_id_ext;
use crate::clients::tl_client::tl::ser_de::serde_ton_hash_vec_base64;
use crate::clients::tl_client::tl::ser_de::serde_tx_id_lt_hash;
use crate::clients::tl_client::tl::types::{
TLAccountAddress, TLAccountTxId, TLBlockId, TLOptions, TLSmcLibraryQueryExt,
};
use crate::clients::tl_client::tl::Base64Standard;
use crate::block_tlb::BlockIdExt;
use crate::error::TLError;
use serde::{Deserialize, Serialize};
use std::ffi::CString;
use strum::IntoStaticStr;
use ton_lib_core::cell::TonHash;
use ton_lib_core::types::TxIdLTHash;
#[derive(IntoStaticStr, Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
#[serde(tag = "@type", rename_all = "camelCase")]
pub enum TLRequest {
LiteServerInfo {
now: i64,
version: i32,
capabilities: i64,
},
Init {
options: TLOptions,
},
#[serde(rename = "raw.sendMessageReturnHash")]
RawSendMsgReturnHash {
#[serde(with = "Base64Standard")]
body: Vec<u8>,
},
#[serde(rename = "sync")]
Sync {},
#[serde(rename = "raw.getAccountState")]
RawGetAccountState {
account_address: TLAccountAddress,
},
#[serde(rename = "raw.getAccountStateByTransaction")]
RawGetAccountStateByTx {
account_address: TLAccountAddress,
#[serde(rename = "transaction_id")]
#[serde(with = "serde_tx_id_lt_hash")]
tx_id: TxIdLTHash,
},
#[serde(rename = "raw.getTransactions")]
RawGetTxs {
account_address: TLAccountAddress,
#[serde(rename = "from_transaction_id")]
#[serde(with = "serde_tx_id_lt_hash")]
from_tx_id: TxIdLTHash,
},
#[serde(rename = "raw.getTransactionsV2")]
RawGetTxsV2 {
account_address: TLAccountAddress,
#[serde(rename = "from_transaction_id")]
#[serde(with = "serde_tx_id_lt_hash")]
from_tx_id: TxIdLTHash,
count: u32,
try_decode_messages: bool,
},
#[serde(rename = "raw.sendMessage")]
RawSendMessage {
#[serde(with = "Base64Standard")]
body: Vec<u8>,
},
#[serde(rename = "getAccountState")]
GetAccountState {
account_address: TLAccountAddress,
},
#[serde(rename = "getConfigParam")]
GetConfigParam {
mode: u32,
param: u32,
},
#[serde(rename = "getConfigAll")]
GetConfigAll {
mode: u32,
},
#[serde(rename = "smc.load")]
SmcLoad {
account_address: TLAccountAddress,
},
#[serde(rename = "smc.loadByTransaction")]
SmcLoadByTransaction {
account_address: TLAccountAddress,
#[serde(rename = "transaction_id")]
#[serde(with = "serde_tx_id_lt_hash")]
tx_id: TxIdLTHash,
},
#[serde(rename = "smc.forget")]
SmcForget {
id: i64,
},
#[serde(rename = "smc.getCode")]
SmcGetCode {
id: i64,
},
#[serde(rename = "smc.getData")]
SmcGetData {
id: i64,
},
#[serde(rename = "smc.getState")]
SmcGetState {
id: i64,
},
#[serde(rename = "smc.runGetMethod")]
SmcRunGetMethod(()),
#[serde(rename = "smc.getLibraries")]
SmcGetLibraries {
#[serde(with = "serde_ton_hash_vec_base64")]
library_list: Vec<TonHash>,
},
#[serde(rename = "smc.getLibrariesExt")]
SmcGetLibrariesExt {
list: Vec<TLSmcLibraryQueryExt>,
},
#[serde(rename = "blocks.getMasterchainInfo")]
BlocksGetMCInfo {},
#[serde(rename = "blocks.getShards")]
BlocksGetShards {
#[serde(with = "serde_block_id_ext")]
id: BlockIdExt,
},
#[serde(rename = "blocks.lookupBlock")]
BlocksLookupBlock {
mode: i32,
id: TLBlockId,
lt: i64,
utime: i32,
},
#[serde(rename = "blocks.getTransactions")]
BlocksGetTxs {
#[serde(with = "serde_block_id_ext")]
id: BlockIdExt,
mode: u32,
count: u32,
after: TLAccountTxId,
},
#[serde(rename = "blocks.getTransactionsExt")]
BlocksGetTransactionsExt {
#[serde(with = "serde_block_id_ext")]
id: BlockIdExt,
mode: u32,
count: u32,
after: TLAccountTxId,
},
#[serde(rename = "blocks.getBlockHeader")]
GetBlockHeader {
#[serde(with = "serde_block_id_ext")]
id: BlockIdExt,
},
#[serde(rename = "liteServer.getInfo")]
LiteServerGetInfo {},
SetLogVerbosityLevel {
new_verbosity_level: u32,
},
GetLogVerbosityLevel {},
}
impl TLRequest {
pub fn to_c_str_json(&self, extra: &str) -> Result<CString, TLError> {
let mut value = serde_json::to_value(self)?;
let obj = value.as_object_mut().unwrap();
let extra_val = serde_json::Value::from(extra);
obj.insert(String::from("@extra"), extra_val);
Ok(CString::new(serde_json::to_string(&value)?)?)
}
}
#[cfg(test)]
mod tests {
use crate::clients::tl_client::tl::request::TLRequest;
use std::ffi::CString;
#[test]
fn test_tl_request_to_c_str_json() -> anyhow::Result<()> {
let req = TLRequest::SetLogVerbosityLevel {
new_verbosity_level: 100500,
};
let cstr: CString = req.to_c_str_json("some_extra")?;
assert_eq!(
"{\"@extra\":\"some_extra\",\"@type\":\"setLogVerbosityLevel\",\"new_verbosity_level\":100500}",
cstr.to_str()?
);
Ok(())
}
}