use crate::frame_result::FrameResult;
use crate::mock_transaction_handler::{
MockTransactionConfig, MockTransactionHandler,
};
use crate::test_environment::TestEnvironmentHandle;
use crate::transact_result::TransactResult;
use thruput_xdr::auth_claim::AuthClaim;
#[must_use = "a TransactionBuilder does nothing until `transact`, `transact_manual`, or `build` is called"]
pub struct TransactionBuilder {
env: TestEnvironmentHandle,
config: MockTransactionConfig,
}
impl TransactionBuilder {
pub fn new(env: TestEnvironmentHandle) -> Self {
Self {
env,
config: MockTransactionConfig::default(),
}
}
pub fn with_auth_claim(mut self, auth_claim: AuthClaim) -> Self {
self.config.auth_claim = auth_claim;
self
}
pub fn build(self) -> MockTransactionHandler {
MockTransactionHandler::new_with_config(self.env, self.config)
}
#[must_use]
pub fn transact(
self,
f: impl FnOnce(&mut MockTransactionHandler) -> FrameResult,
) -> TransactResult {
let mut tx = self.build();
let frame_result = f(&mut tx);
let exec_result = tx.try_commit_transaction().exec_result();
TransactResult::new(frame_result, exec_result)
}
pub fn transact_manual<R>(
self,
f: impl FnOnce(&mut MockTransactionHandler) -> R,
) -> R {
let mut tx = self.build();
let out = f(&mut tx);
assert!(
!tx.is_running(),
"transact_manual closure returned without finishing the \
transaction: call tx.try_commit_transaction() or \
tx.abort_transaction() before returning"
);
out
}
}