use std::path::PathBuf;
use std::sync::OnceLock;
use crate::ska_dict::bit_encoding::{decode_base, encode_base};
#[derive(Debug)]
pub struct Config {
pub input_file: String,
pub output_name: String,
pub max_missing: f32,
pub max_depth: usize,
pub max_indel_kmers: usize,
pub nb_threads: usize,
pub reference_genome: Option<PathBuf>,
}
pub static CONFIG: OnceLock<Config> = OnceLock::new();
#[derive(Debug, Clone)]
pub struct DataInfo {
pub k_graph: usize,
pub sample_names: Vec<String>,
}
pub static DATA_INFO: OnceLock<DataInfo> = OnceLock::new();
pub fn rev_compl(seq: &str) -> String {
let out: String = seq
.chars()
.rev()
.map(|nt| match nt {
'A' => 'T',
'C' => 'G',
'T' => 'A',
'G' => 'C',
_ => panic!("Error taking reverse complement of {nt}"),
})
.collect();
out
}
#[derive(Clone)]
pub struct VariantInfo {
pub sequence: DnaSequence,
pub vec_snps: Vec<usize>,
}
impl VariantInfo {
pub fn new(sequence: DnaSequence, vec_snps: Vec<usize>) -> Self {
VariantInfo { sequence, vec_snps }
}
}
#[derive(Clone)]
pub struct DnaSequence {
pub data: Vec<u8>,
pub original_length: usize,
}
impl DnaSequence {
pub fn encode(dna: &str) -> Self {
let data: Vec<u8> = dna.as_bytes().iter().map(|nt| encode_base(*nt)).collect();
DnaSequence {
data,
original_length: dna.len(),
}
}
pub fn decode(&self) -> String {
let out: String = self
.data
.iter()
.map(|nt| decode_base(*nt & 0b11) as char)
.collect();
out
}
pub fn len(&self) -> usize {
self.original_length
}
pub fn is_empty(&self) -> bool {
self.original_length == 0
}
pub fn get_range(&self, start: usize, end: usize) -> Vec<u8> {
let out: Vec<u8> = self.data[start..end]
.iter()
.map(|nt| decode_base(*nt & 0b11))
.collect();
out
}
}