use std::io::{BufReader, BufWriter};
use std::fs::OpenOptions;
use std::path::{Path, PathBuf};
use serde::{Deserialize, Serialize};
use serde_json::to_writer;
#[derive(Copy, Clone, Serialize, Deserialize, Debug)]
pub enum DataType {
DNA,
AA,
}
#[derive(Copy, Clone, Serialize, Deserialize, Debug)]
pub enum SketchAlgo {
PROB3A,
SUPER,
SUPER2,
OPTDENS,
REVOPTDENS,
HLL,
}
#[derive(Copy, Clone, Serialize, Deserialize, Debug)]
pub struct SeqSketcherParams {
kmer_size: usize,
sketch_size: usize,
algo: SketchAlgo,
data_t: DataType,
}
impl SeqSketcherParams {
pub fn new(kmer_size: usize, sketch_size: usize, algo: SketchAlgo, data_t: DataType) -> Self {
SeqSketcherParams {
kmer_size,
sketch_size,
algo,
data_t,
}
}
pub fn get_kmer_size(&self) -> usize {
self.kmer_size
}
pub fn get_sketch_size(&self) -> usize {
self.sketch_size
}
pub fn get_algo(&self) -> SketchAlgo {
self.algo
}
pub fn get_data_t(&self) -> DataType {
self.data_t
}
pub fn dump_json(&self, filename: &String) -> Result<(), String> {
let filepath = PathBuf::from(filename.clone());
log::info!("dumping sketching parameters in json file : {}", filename);
let fileres = OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(&filepath);
if fileres.is_err() {
log::error!(
"SeqSketcher dump : dump could not open file {:?}",
filepath.as_os_str()
);
println!(
"SeqSketcher dump: could not open file {:?}",
filepath.as_os_str()
);
return Err("SeqSketcher dump failed".to_string());
}
let mut writer = BufWriter::new(fileres.unwrap());
to_writer(&mut writer, &self).unwrap();
Ok(())
}
pub fn reload_json(dirpath: &Path) -> Result<SeqSketcherParams, String> {
log::info!("in reload_json");
let filepath = dirpath.join("sketchparams_dump.json");
let fileres = OpenOptions::new().read(true).open(&filepath);
if fileres.is_err() {
log::error!(
"Sketcher reload_json : reload could not open file {:?}",
filepath.as_os_str()
);
println!(
"Sketcher reload_json: could not open file {:?}",
filepath.as_os_str()
);
return Err("Sketcher reload_json could not open file".to_string());
}
let loadfile = fileres.unwrap();
let reader = BufReader::new(loadfile);
let sketch_params: SeqSketcherParams = serde_json::from_reader(reader).unwrap();
log::info!(
"SeqSketcher reload, kmer_size : {}, sketch_size : {}",
sketch_params.get_kmer_size(),
sketch_params.get_sketch_size()
);
Ok(sketch_params)
} }