use std::fmt;
use super::transaction::TxnSession;
#[non_exhaustive]
pub struct TxnContext {
session: Box<dyn TxnSession>,
}
impl TxnContext {
pub(crate) fn new(session: Box<dyn TxnSession>) -> Self {
Self { session }
}
pub(crate) fn session_mut(&mut self) -> &mut dyn TxnSession {
&mut *self.session
}
}
impl fmt::Debug for TxnContext {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("TxnContext").finish_non_exhaustive()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::engine::{EngineError, EngineResult};
struct CountingTxn {
commits: u32,
rollbacks: u32,
}
impl TxnSession for CountingTxn {
fn commit(&mut self, _all: bool) -> EngineResult {
self.commits += 1;
Ok(())
}
fn rollback(&mut self, _all: bool) -> EngineResult {
self.rollbacks += 1;
Err(EngineError::Internal)
}
}
#[test]
fn session_mut_dispatches_to_the_boxed_session() {
let mut ctx = TxnContext::new(Box::new(CountingTxn {
commits: 0,
rollbacks: 0,
}));
assert_eq!(ctx.session_mut().commit(true), Ok(()));
assert_eq!(ctx.session_mut().commit(false), Ok(()));
assert_eq!(ctx.session_mut().rollback(true), Err(EngineError::Internal));
}
#[test]
fn prepare_defaults_to_ok() {
let mut ctx = TxnContext::new(Box::new(CountingTxn {
commits: 0,
rollbacks: 0,
}));
assert_eq!(ctx.session_mut().prepare(true), Ok(()));
}
}