use std::collections::HashMap;
use super::{
DataProcessing, FileDescription, InstrumentConfiguration, MassSpectrometryRun, Software,
};
pub trait MSDataFileMetadata {
fn data_processings(&self) -> &Vec<DataProcessing>;
fn instrument_configurations(&self) -> &HashMap<u32, InstrumentConfiguration>;
fn file_description(&self) -> &FileDescription;
fn softwares(&self) -> &Vec<Software>;
fn data_processings_mut(&mut self) -> &mut Vec<DataProcessing>;
fn instrument_configurations_mut(&mut self) -> &mut HashMap<u32, InstrumentConfiguration>;
fn file_description_mut(&mut self) -> &mut FileDescription;
fn softwares_mut(&mut self) -> &mut Vec<Software>;
fn copy_metadata_from(&mut self, source: &impl MSDataFileMetadata) {
*self.data_processings_mut() = source.data_processings().clone();
*self.instrument_configurations_mut() = source.instrument_configurations().clone();
*self.file_description_mut() = source.file_description().clone();
*self.softwares_mut() = source.softwares().clone();
match source.run_description() {
Some(run) => {
let desc = self.run_description_mut();
if let Some(r) = desc {
*r = run.clone();
};
}
None => {
let mut desc = self.run_description_mut();
desc.take();
}
}
}
fn spectrum_count_hint(&self) -> Option<u64> {
None
}
fn run_description(&self) -> Option<&MassSpectrometryRun> {
None
}
fn run_description_mut(&mut self) -> Option<&mut MassSpectrometryRun> {
None
}
fn source_file_name(&self) -> Option<&str> {
self.file_description().source_files.first().map(|s| s.name.as_str())
}
}
#[macro_export]
macro_rules! impl_metadata_trait {
(extended) => {
$crate::impl_metadata_trait();
fn spectrum_count_hint(&self) -> Option<u64> {
self.num_spectra
}
fn run_description(&self) -> Option<&$crate::meta::MassSpectrometryRun> {
Some(&self.run)
}
fn run_description_mut(&mut self) -> Option<&mut $crate::meta::MassSpectrometryRun> {
Some(&mut self.run)
}
};
() => {
fn data_processings(&self) -> &Vec<$crate::meta::DataProcessing> {
&self.data_processings
}
fn instrument_configurations(&self) -> &std::collections::HashMap<u32, $crate::meta::InstrumentConfiguration> {
&self.instrument_configurations
}
fn file_description(&self) -> &$crate::meta::FileDescription {
&self.file_description
}
fn softwares(&self) -> &Vec<$crate::meta::Software> {
&self.softwares
}
fn data_processings_mut(&mut self) -> &mut Vec<$crate::meta::DataProcessing> {
&mut self.data_processings
}
fn instrument_configurations_mut(&mut self) -> &mut std::collections::HashMap<u32, $crate::meta::InstrumentConfiguration> {
&mut self.instrument_configurations
}
fn file_description_mut(&mut self) -> &mut $crate::meta::FileDescription {
&mut self.file_description
}
fn softwares_mut(&mut self) -> &mut Vec<$crate::meta::Software> {
&mut self.softwares
}
};
}
#[macro_export]
macro_rules! delegate_impl_metadata_trait {
($src:tt, extended) => {
$crate::delegate_impl_metadata_trait($src);
fn spectrum_count_hint(&self) -> Option<u64> {
self.$src.spectrum_count_hint()
}
fn run_description(&self) -> Option<&$crate::meta::MassSpectrometryRun> {
self.$src.run_description()
}
fn run_description_mut(&mut self) -> Option<&mut $crate::meta::MassSpectrometryRun> {
self.$src.run_description_mut()
}
};
($src:tt) => {
fn data_processings(&self) -> &Vec<$crate::meta::DataProcessing> {
self.$src.data_processings()
}
fn instrument_configurations(&self) -> &std::collections::HashMap<u32, $crate::meta::InstrumentConfiguration> {
self.$src.instrument_configurations()
}
fn file_description(&self) -> &$crate::meta::FileDescription {
self.$src.file_description()
}
fn softwares(&self) -> &Vec<$crate::meta::Software> {
self.$src.softwares()
}
fn data_processings_mut(&mut self) -> &mut Vec<$crate::meta::DataProcessing> {
self.$src.data_processings_mut()
}
fn instrument_configurations_mut(&mut self) -> &mut std::collections::HashMap<u32, $crate::meta::InstrumentConfiguration> {
self.$src.instrument_configurations_mut()
}
fn file_description_mut(&mut self) -> &mut $crate::meta::FileDescription {
self.$src.file_description_mut()
}
fn softwares_mut(&mut self) -> &mut Vec<$crate::meta::Software> {
self.$src.softwares_mut()
}
fn spectrum_count_hint(&self) -> Option<u64> {
self.$src.spectrum_count_hint()
}
fn run_description(&self) -> Option<&$crate::meta::MassSpectrometryRun> {
self.$src.run_description()
}
fn run_description_mut(&mut self) -> Option<&mut $crate::meta::MassSpectrometryRun> {
self.$src.run_description_mut()
}
};
}