use timsrust_core::{Converter, FrameIndex, Im, Mz, Rt, ScanIndex, TofIndex};
use crate::{TimsTofPath, timstof::TimsTofFileType};
#[derive(Debug, Clone)]
pub enum MzConverter {
#[cfg(feature = "sdk")]
Sdk(timsrust_sdk::WrappedTof2MzConverterSDK),
#[cfg(feature = "patched")]
Bps(timsrust_patched::Tof2MzConverter),
Bit(timsrust_core::BitConverter),
Tdf(timsrust_tdf::Tof2MzConverter),
TSF(timsrust_tsf::Tof2MzConverter),
MiniTdf,
}
impl MzConverter {
pub fn new(path: impl AsRef<str>) -> Option<Self> {
let timstof = TimsTofPath::new(path.as_ref()).ok()?;
#[allow(unreachable_code)]
match timstof.file_type() {
TimsTofFileType::Tdf(tdf_path) => {
#[cfg(feature = "sdk")]
return Some(MzConverter::Sdk(
timsrust_sdk::WrappedTof2MzConverterSDK::new(
tdf_path.tdf().as_ref(),
)?,
));
#[cfg(feature = "patched")]
return Some(MzConverter::Bps(
timsrust_patched::Tof2MzConverter::from_tdf(
tdf_path.tdf().as_ref(),
)?,
));
Some(MzConverter::Tdf(timsrust_tdf::Tof2MzConverter::new(
tdf_path.tdf().as_ref(),
)))
},
TimsTofFileType::MiniTdf(_) => Some(MzConverter::MiniTdf),
TimsTofFileType::Parquet(_) => {
Some(MzConverter::Bit(timsrust_core::BitConverter()))
},
TimsTofFileType::Tsf(_) => Some(MzConverter::TSF(
timsrust_tsf::Tof2MzConverter::new(timstof.as_ref()),
)),
}
}
}
impl Converter<TofIndex, Mz> for MzConverter {
fn convert(&self, tof_index: TofIndex) -> Mz {
match self {
#[cfg(feature = "patched")]
Self::Bps(converter) => converter.convert(tof_index),
#[cfg(feature = "sdk")]
Self::Sdk(converter) => converter.convert(tof_index),
Self::Bit(converter) => converter.convert(tof_index),
Self::Tdf(converter) => converter.convert(tof_index),
Self::TSF(converter) => converter.convert(tof_index),
Self::MiniTdf => timsrust_core::BitConverter().convert(tof_index),
}
}
}
impl Converter<Mz, TofIndex> for MzConverter {
fn convert(&self, mz: Mz) -> TofIndex {
match self {
#[cfg(feature = "patched")]
Self::Bps(converter) => converter.convert(mz),
#[cfg(feature = "sdk")]
Self::Sdk(converter) => converter.convert(mz),
Self::Bit(converter) => converter.convert(mz),
Self::Tdf(converter) => converter.convert(mz),
Self::TSF(converter) => converter.convert(mz),
Self::MiniTdf => timsrust_core::BitConverter().convert(mz),
}
}
}
#[derive(Debug, Clone)]
pub enum ImConverter {
#[cfg(feature = "sdk")]
Sdk(timsrust_sdk::WrappedScan2ImConverterSDK),
#[cfg(feature = "patched")]
Bps(timsrust_patched::Scan2ImConverter),
Bit(timsrust_core::BitConverter),
Tdf(timsrust_tdf::Scan2ImConverter),
MiniTdf,
}
impl ImConverter {
pub fn new(path: impl AsRef<str>) -> Option<Self> {
let timstof = TimsTofPath::new(path.as_ref()).ok()?;
#[allow(unreachable_code)]
match timstof.file_type() {
TimsTofFileType::Tdf(tdf_path) => {
#[cfg(feature = "sdk")]
return Some(ImConverter::Sdk(
timsrust_sdk::WrappedScan2ImConverterSDK::new(
tdf_path.tdf().as_ref(),
)?,
));
#[cfg(feature = "patched")]
return Some(ImConverter::Bps(
timsrust_patched::Scan2ImConverter::from_tdf(
tdf_path.tdf().as_ref(),
)?,
));
Some(ImConverter::Tdf(timsrust_tdf::Scan2ImConverter::new(
tdf_path.tdf().as_ref(),
)))
},
TimsTofFileType::MiniTdf(_) => Some(ImConverter::MiniTdf),
TimsTofFileType::Parquet(_) => {
Some(ImConverter::Bit(timsrust_core::BitConverter()))
},
TimsTofFileType::Tsf(_) => {
Some(ImConverter::Bit(timsrust_core::BitConverter()))
},
}
}
}
impl Converter<ScanIndex, Im> for ImConverter {
fn convert(&self, scan_index: ScanIndex) -> Im {
match self {
#[cfg(feature = "patched")]
Self::Bps(converter) => converter.convert(scan_index),
#[cfg(feature = "sdk")]
Self::Sdk(converter) => converter.convert(scan_index),
Self::Bit(converter) => converter.convert(scan_index),
Self::Tdf(converter) => converter.convert(scan_index),
Self::MiniTdf => timsrust_core::BitConverter().convert(scan_index),
}
}
}
impl Converter<Im, ScanIndex> for ImConverter {
fn convert(&self, im: Im) -> ScanIndex {
match self {
#[cfg(feature = "patched")]
Self::Bps(converter) => converter.convert(im),
#[cfg(feature = "sdk")]
Self::Sdk(converter) => converter.convert(im),
Self::Bit(converter) => converter.convert(im),
Self::Tdf(converter) => converter.convert(im),
Self::MiniTdf => timsrust_core::BitConverter().convert(im),
}
}
}
#[derive(Debug, Clone)]
pub enum RtConverter {
Bit(timsrust_core::BitConverter),
Tdf(timsrust_tdf::Frame2RtConverter),
MiniTdf,
}
impl RtConverter {
pub fn new(path: impl AsRef<str>) -> Option<Self> {
let timstof = TimsTofPath::new(path.as_ref()).ok()?;
match timstof.file_type() {
TimsTofFileType::Tdf(tdf_path) => Some(RtConverter::Tdf(
timsrust_tdf::Frame2RtConverter::new(tdf_path.tdf().as_ref()),
)),
TimsTofFileType::MiniTdf(_) => Some(RtConverter::MiniTdf),
TimsTofFileType::Parquet(_) => {
Some(RtConverter::Bit(timsrust_core::BitConverter()))
},
TimsTofFileType::Tsf(_) => {
Some(RtConverter::Bit(timsrust_core::BitConverter()))
},
}
}
}
impl Converter<FrameIndex, Rt> for RtConverter {
fn convert(&self, frame_index: FrameIndex) -> Rt {
match self {
Self::Bit(converter) => converter.convert(frame_index),
Self::Tdf(converter) => converter.convert(frame_index),
Self::MiniTdf => timsrust_core::BitConverter().convert(frame_index),
}
}
}
impl Converter<Rt, FrameIndex> for RtConverter {
fn convert(&self, rt: Rt) -> FrameIndex {
match self {
Self::Bit(converter) => converter.convert(rt),
Self::Tdf(converter) => converter.convert(rt),
Self::MiniTdf => timsrust_core::BitConverter().convert(rt),
}
}
}