use std::{ops::RangeInclusive, path::PathBuf};
use serde::{Deserialize, Serialize};
use mzcore::system::OrderedTime;
#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub enum SpectrumIds {
#[default]
None,
FileNotKnown(Vec<SpectrumId>),
FileKnown(Vec<(PathBuf, Vec<SpectrumId>)>),
}
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub enum SpectrumId {
Native(String),
Index(usize),
Number(usize),
RetentionTime(RangeInclusive<OrderedTime>),
}
impl Default for SpectrumId {
fn default() -> Self {
Self::Index(0)
}
}
impl std::fmt::Display for SpectrumId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Index(i) => write!(f, "{i}"),
Self::Number(i) => write!(f, "\x23{i}"),
Self::Native(n) => write!(f, "{n}"),
Self::RetentionTime(n) => {
write!(f, "{:.3} — {:.3} min", n.start().value, n.end().value)
}
}
}
}
impl SpectrumId {
pub fn index(&self) -> Option<usize> {
match self {
Self::Index(i) => Some(*i),
Self::Number(i) => Some(i - 1),
Self::Native(_) | Self::RetentionTime(_) => None,
}
}
pub fn native(&self) -> Option<&str> {
match self {
Self::Native(n) => Some(n),
Self::Index(_) | Self::RetentionTime(_) | Self::Number(_) => None,
}
}
}