use pezframe_support::storage::{with_transaction, TransactionOutcome};
use pezsp_runtime::DispatchError;
use xcm::latest::prelude::*;
use xcm_executor::traits::ProcessTransaction;
pub struct FrameTransactionalProcessor;
impl ProcessTransaction for FrameTransactionalProcessor {
const IS_TRANSACTIONAL: bool = true;
fn process<F>(f: F) -> Result<(), XcmError>
where
F: FnOnce() -> Result<(), XcmError>,
{
with_transaction(|| -> TransactionOutcome<Result<_, DispatchError>> {
let output = f();
match &output {
Ok(()) => TransactionOutcome::Commit(Ok(output)),
_ => TransactionOutcome::Rollback(Ok(output)),
}
})
.map_err(|error| {
tracing::debug!(target: "xcm::transactional", ?error, "Failed to process XCM transaction");
XcmError::ExceedsStackLimit
})?
}
}