pub mod error;
pub mod fault_handler;
pub mod recv;
pub mod send;
pub use fault_handler::*;
use std::{collections::HashMap, fmt};
use camino::Utf8PathBuf;
use error::TransactionError;
use num_derive::FromPrimitive;
use serde::Serialize;
use crate::{
filestore::ChecksumType,
pdu::header::{CRCFlag, Condition, FileSizeFlag, SegmentedData, TransmissionMode},
pdu::ops::{EntityID, TransactionSeqNum},
};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct TransactionID(pub EntityID, pub TransactionSeqNum);
pub type TransactionResult<T> = Result<T, TransactionError>;
impl fmt::Display for TransactionID {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}.{}", self.0.to_u64(), self.1.to_u64())
}
}
impl TransactionID {
pub fn from(entity_id: EntityID, seq_num: TransactionSeqNum) -> Self {
Self(entity_id, seq_num)
}
}
#[repr(u8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive, Serialize)]
pub enum TransactionState {
Active,
Suspended,
Terminated,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Metadata {
pub source_filename: Utf8PathBuf,
pub destination_filename: Utf8PathBuf,
pub file_size: u64,
pub checksum_type: ChecksumType,
}
#[derive(Clone)]
pub struct TransactionConfig {
pub source_entity_id: EntityID,
pub destination_entity_id: EntityID,
pub transmission_mode: TransmissionMode,
pub sequence_number: TransactionSeqNum,
pub file_size_flag: FileSizeFlag,
pub fault_handler_override: HashMap<Condition, FaultHandlerAction>,
pub file_size_segment: u16,
pub crc_flag: CRCFlag,
pub segment_metadata_flag: SegmentedData,
pub max_count: u32,
pub inactivity_timeout: i64,
pub nak_timeout: i64,
pub eof_timeout: i64,
pub progress_report_interval_secs: i64,
}
#[cfg(test)]
mod test {
use super::*;
use std::collections::HashMap;
use crate::{
pdu::header::{CRCFlag, FileSizeFlag, SegmentedData, TransmissionMode},
transaction::TransactionConfig,
};
use rstest::fixture;
#[fixture]
#[once]
pub(crate) fn default_config() -> TransactionConfig {
TransactionConfig {
source_entity_id: EntityID::from(12_u16),
destination_entity_id: EntityID::from(15_u16),
transmission_mode: TransmissionMode::Acknowledged,
sequence_number: TransactionSeqNum::from(3_u32),
file_size_flag: FileSizeFlag::Small,
fault_handler_override: HashMap::new(),
file_size_segment: 16630_u16,
crc_flag: CRCFlag::NotPresent,
segment_metadata_flag: SegmentedData::NotPresent,
max_count: 5_u32,
inactivity_timeout: 300_i64,
eof_timeout: 300_i64,
nak_timeout: 300_i64,
progress_report_interval_secs: 300_i64,
}
}
#[test]
fn id() {
let id = TransactionID::from(EntityID::from(13_u16), TransactionSeqNum::from(541_u32));
assert_eq!(
TransactionID(EntityID::from(13), TransactionSeqNum::from(541)),
id,
)
}
}