use std::path::Path;
use std::io;
use crate::io::infer_format;
use crate::impl_param_described;
use crate::params::{Param, ParamDescribed, ParamList, CURIE, ControlledVocabulary};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct SourceFile {
pub name: String,
pub location: String,
pub id: String,
pub file_format: Option<Param>,
pub id_format: Option<Param>,
pub params: ParamList,
}
impl SourceFile {
pub fn from_path<P: AsRef<Path>>(path: P) -> io::Result<Self> {
let path = path.as_ref();
let (format, _gz) = infer_format(path)?;
let inst = Self {
name: path.file_name().map(|n| n.to_string_lossy().to_string()).unwrap_or_default(),
location: path.canonicalize()?.parent().map(|s| format!("file://{}", s.to_string_lossy())).unwrap_or_else(|| "file://".to_string()),
file_format: format.as_param(),
..Default::default()
};
Ok(inst)
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct FileDescription {
pub contents: ParamList,
pub source_files: Vec<SourceFile>,
}
impl FileDescription {
pub fn new(contents: ParamList, source_files: Vec<SourceFile>) -> Self {
Self {
contents,
source_files,
}
}
pub fn has_ms1_spectra(&self) -> bool {
self.get_param_by_curie(&CURIE::new(ControlledVocabulary::MS, 1000579)).is_some()
}
pub fn has_msn_spectra(&self) -> bool {
self.get_param_by_curie(&CURIE::new(ControlledVocabulary::MS, 1000580)).is_some()
}
pub fn has_contents(&self) -> bool {
!self.contents.is_empty()
}
}
impl_param_described!(SourceFile);
impl ParamDescribed for FileDescription {
fn params(&self) -> &[Param] {
&self.contents
}
fn params_mut(&mut self) -> &mut ParamList {
&mut self.contents
}
}