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
30impl QSym2FileType {
31 pub fn ext(&self) -> String {
33 match self {
34 QSym2FileType::Sym => "qsym2.sym".to_string(),
35 QSym2FileType::Grp => "qsym2.grp".to_string(),
36 QSym2FileType::Rep => "qsym2.rep".to_string(),
37 QSym2FileType::Chr => "qsym2.chr".to_string(),
38 }
39 }
40}
41
42pub fn read_qsym2_binary<T, P: AsRef<Path>>(
53 name: P,
54 file_type: QSym2FileType,
55) -> Result<T, anyhow::Error>
56where
57 T: DeserializeOwned,
58{
59 let mut path = name.as_ref().to_path_buf();
60 path.set_extension(file_type.ext());
61 let mut reader = BufReader::new(File::open(path).map_err(|err| format_err!(err))?);
62 bincode::serde::decode_from_std_read(&mut reader, bincode::config::legacy())
63 .map_err(|err| format_err!(err))
64}
65
66pub fn write_qsym2_binary<T, P: AsRef<Path>>(
77 name: P,
78 file_type: QSym2FileType,
79 value: &T,
80) -> Result<usize, anyhow::Error>
81where
82 T: Serialize,
83{
84 let mut path = name.as_ref().to_path_buf();
85 path.set_extension(file_type.ext());
86 let mut writer = BufWriter::new(File::create(path)?);
87 bincode::serde::encode_into_std_write(value, &mut writer, bincode::config::legacy())
88 .map_err(|err| format_err!(err))
89}
90
91pub fn read_qsym2_yaml<T, P: AsRef<Path>>(name: P) -> Result<T, anyhow::Error>
101where
102 T: DeserializeOwned,
103{
104 let mut reader = BufReader::new(File::open(name).map_err(|err| format_err!(err))?);
105 serde_yaml::from_reader(&mut reader).map_err(|err| format_err!(err))
106}
107
108pub fn write_qsym2_yaml<T, P: AsRef<Path>>(name: P, value: &T) -> Result<(), anyhow::Error>
119where
120 T: Serialize,
121{
122 let mut path = name.as_ref().to_path_buf();
123 path.set_extension("yml");
124 let mut writer = BufWriter::new(File::create(path)?);
125 serde_yaml::to_writer(&mut writer, value).map_err(|err| format_err!(err))
126}