1use std::fs::File;
4use std::io::{BufReader, BufWriter};
5use std::path::Path;
6
7use anyhow::{self, format_err};
8use bincode;
9use serde::{de::DeserializeOwned, Serialize};
10use serde_yaml;
11
12pub(crate) mod format;
13pub(crate) mod numeric;
14
15pub enum QSym2FileType {
17 Sym,
19
20 Grp,
22
23 Rep,
25
26 Chr,
28
29 Pymdet,
31}
32
33impl QSym2FileType {
34 pub fn ext(&self) -> String {
36 match self {
37 QSym2FileType::Sym => "qsym2.sym".to_string(),
38 QSym2FileType::Grp => "qsym2.grp".to_string(),
39 QSym2FileType::Rep => "qsym2.rep".to_string(),
40 QSym2FileType::Chr => "qsym2.chr".to_string(),
41 QSym2FileType::Pymdet => "qsym2.pymdet".to_string(),
42 }
43 }
44}
45
46pub fn read_qsym2_binary<T, P: AsRef<Path>>(
57 name: P,
58 file_type: QSym2FileType,
59) -> Result<T, anyhow::Error>
60where
61 T: DeserializeOwned,
62{
63 let mut path = name.as_ref().to_path_buf();
64 path.set_extension(file_type.ext());
65 let mut reader = BufReader::new(File::open(path).map_err(|err| format_err!(err))?);
66 bincode::serde::decode_from_std_read(&mut reader, bincode::config::legacy())
67 .map_err(|err| format_err!(err))
68}
69
70pub fn write_qsym2_binary<T, P: AsRef<Path>>(
81 name: P,
82 file_type: QSym2FileType,
83 value: &T,
84) -> Result<usize, anyhow::Error>
85where
86 T: Serialize,
87{
88 let mut path = name.as_ref().to_path_buf();
89 path.set_extension(file_type.ext());
90 let mut writer = BufWriter::new(File::create(path)?);
91 bincode::serde::encode_into_std_write(value, &mut writer, bincode::config::legacy())
92 .map_err(|err| format_err!(err))
93}
94
95pub fn read_qsym2_yaml<T, P: AsRef<Path>>(name: P) -> Result<T, anyhow::Error>
105where
106 T: DeserializeOwned,
107{
108 let mut reader = BufReader::new(File::open(name).map_err(|err| format_err!(err))?);
109 serde_yaml::from_reader(&mut reader).map_err(|err| format_err!(err))
110}
111
112pub fn write_qsym2_yaml<T, P: AsRef<Path>>(name: P, value: &T) -> Result<(), anyhow::Error>
123where
124 T: Serialize,
125{
126 let mut path = name.as_ref().to_path_buf();
127 path.set_extension("yml");
128 let mut writer = BufWriter::new(File::create(path)?);
129 serde_yaml::to_writer(&mut writer, value).map_err(|err| format_err!(err))
130}