multiversx_sc_scenario/scenario/tx_to_step/
step_wrapper.rs

1use multiversx_sc::{
2    tuple_util::NestedTupleFlatten,
3    types::{RHListExec, TxEnv},
4};
5
6use crate::scenario_model::{ScCallStep, ScDeployStep, ScQueryStep, TxResponse};
7
8pub struct StepWrapper<Env, Step, RH> {
9    pub env: Env,
10    pub step: Step,
11    pub result_handler: RH,
12}
13
14impl<Env, Step, RH> StepWrapper<Env, Step, RH>
15where
16    Env: TxEnv,
17    Step: StepWithResponse,
18    RH: RHListExec<TxResponse, Env>,
19    RH::ListReturns: NestedTupleFlatten,
20{
21    pub fn process_result(self) -> <RH::ListReturns as NestedTupleFlatten>::Unpacked {
22        let response = self.step.into_response();
23        let tuple_result = self.result_handler.list_process_result(&response);
24        tuple_result.flatten_unpack()
25    }
26}
27
28pub trait StepWithResponse {
29    fn into_response(self) -> TxResponse;
30}
31
32impl StepWithResponse for ScCallStep {
33    fn into_response(self) -> TxResponse {
34        self.response.expect("SC call step did not return result")
35    }
36}
37
38impl StepWithResponse for ScDeployStep {
39    fn into_response(self) -> TxResponse {
40        self.response.expect("SC deploy step did not return result")
41    }
42}
43
44impl StepWithResponse for ScQueryStep {
45    fn into_response(self) -> TxResponse {
46        self.response.expect("SC query step did not return result")
47    }
48}