use std::convert::AsRef;
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Cursor, Write};
use std::path::Path;
use util::ResultType;
#[repr(u8)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub enum MgfKind {
MsConvert = 1,
Pava = 2,
Pwiz = 3,
FullMs = 4,
}
pub trait Mgf: Sized {
#[inline(always)]
fn estimate_mgf_size(&self, _: MgfKind) -> usize {
0
}
fn to_mgf<T: Write>(&self, writer: &mut T, kind: MgfKind) -> ResultType<()>;
fn to_mgf_string(&self, kind: MgfKind) -> ResultType<String> {
let capacity = self.estimate_mgf_size(kind);
let mut writer = Cursor::new(Vec::with_capacity(capacity));
self.to_mgf(&mut writer, kind)?;
match String::from_utf8(writer.into_inner()) {
Err(e) => Err(Box::new(e)),
Ok(v) => Ok(v),
}
}
#[inline]
fn to_mgf_file<P: AsRef<Path>>(&self, path: P, kind: MgfKind) -> ResultType<()> {
let file = File::create(path)?;
let mut writer = BufWriter::new(file);
self.to_mgf(&mut writer, kind)
}
fn from_mgf<T: BufRead>(reader: &mut T, kind: MgfKind) -> ResultType<Self>;
#[inline]
fn from_mgf_string(text: &str, kind: MgfKind) -> ResultType<Self> {
let mut reader = Cursor::new(text);
Self::from_mgf(&mut reader, kind)
}
#[inline]
fn from_mgf_file<P: AsRef<Path>>(path: P, kind: MgfKind) -> ResultType<Self> {
let file = File::open(path)?;
let mut reader = BufReader::new(file);
Self::from_mgf(&mut reader, kind)
}
}
pub trait MgfCollection: Mgf {
fn to_mgf_strict<T: Write>(&self, writer: &mut T, kind: MgfKind) -> ResultType<()>;
fn to_mgf_lenient<T: Write>(&self, writer: &mut T, kind: MgfKind) -> ResultType<()>;
fn from_mgf_strict<T: BufRead>(reader: &mut T, kind: MgfKind) -> ResultType<Self>;
fn from_mgf_lenient<T: BufRead>(reader: &mut T, kind: MgfKind) -> ResultType<Self>;
}