use crate::value::DictionaryValue;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TransactionState {
Active,
Committed,
Aborted,
}
pub struct DocumentTransaction<V: DictionaryValue> {
pub tx_id: u64,
pub document_id: String,
pub(crate) shadow_terms: Vec<(Vec<u8>, Option<V>)>,
pub(crate) increments: Vec<(Vec<u8>, i64)>,
pub(crate) failure: Option<String>,
pub state: TransactionState,
}
impl<V: DictionaryValue> DocumentTransaction<V> {
pub(crate) fn new_active(tx_id: u64, document_id: String) -> Self {
Self {
tx_id,
document_id,
shadow_terms: Vec::new(),
increments: Vec::new(),
failure: None,
state: TransactionState::Active,
}
}
pub fn len(&self) -> usize {
self.shadow_terms.len()
}
pub fn is_empty(&self) -> bool {
self.shadow_terms.is_empty()
}
pub fn document_id(&self) -> &str {
&self.document_id
}
pub fn is_active(&self) -> bool {
self.state == TransactionState::Active
}
pub(crate) fn mark_failed(&mut self, reason: impl Into<String>) {
if self.failure.is_none() {
self.failure = Some(reason.into());
}
}
pub(crate) fn failure_reason(&self) -> Option<&str> {
self.failure.as_deref()
}
}