use crate::{dds::traits::key::*, structure::guid::GUID};
use crate::structure::time::Timestamp;
use crate::dds::sampleinfo::*;
#[derive(PartialEq, Debug)]
pub struct DataSample<D: Keyed> {
pub(crate) sample_info: SampleInfo,
pub(crate) value: std::result::Result<D, D::K>,
}
impl<D> DataSample<D>
where
D: Keyed,
{
pub(crate) fn new(sample_info: SampleInfo, value: std::result::Result<D, D::K>) -> Self {
DataSample { sample_info, value }
}
pub(crate) fn new_deprecated(
source_timestamp: Timestamp,
payload: D,
writer_guid: GUID,
) -> DataSample<D> {
let sample_state = SampleState::NotRead;
let view_state = ViewState::New;
let instance_state = InstanceState::Alive;
let sample_rank = 0;
let generation_rank = 0;
let absolute_generation_rank = 0;
DataSample {
sample_info: SampleInfo {
sample_state,
view_state,
instance_state,
generation_counts: NotAliveGenerationCounts::zero(),
sample_rank,
generation_rank,
absolute_generation_rank,
source_timestamp: Some(source_timestamp),
publication_handle: writer_guid,
},
value: Ok(payload),
}
}
pub(crate) fn new_disposed<K>(
source_timestamp: Timestamp,
key: D::K,
writer_guid: GUID,
) -> DataSample<D>
where
<D as Keyed>::K: Key,
{
let sample_state = SampleState::NotRead;
let view_state = ViewState::New;
let instance_state = InstanceState::NotAlive_Disposed;
let sample_rank = 0;
let generation_rank = 0;
let absolute_generation_rank = 0;
DataSample {
sample_info: SampleInfo {
sample_state,
view_state,
instance_state,
generation_counts: NotAliveGenerationCounts::zero(),
sample_rank,
generation_rank,
absolute_generation_rank,
source_timestamp: Some(source_timestamp),
publication_handle: writer_guid,
},
value: Err(key),
}
}
pub fn get_key(&self) -> D::K
where
<D as Keyed>::K: Key,
{
match &self.value {
Ok(d) => d.get_key(),
Err(k) => k.clone(),
}
}
pub fn value(&self) -> &Result<D, D::K> {
&self.value
}
pub fn into_value(self) -> Result<D, D::K> {
self.value
}
pub fn sample_info(&self) -> &SampleInfo {
&self.sample_info
}
pub fn sample_info_mut(&mut self) -> &mut SampleInfo {
&mut self.sample_info
}
}