1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use std::fs::{metadata, File};
use std::io::{BufReader, Read};
pub struct Sequences {
reader: Box<dyn Read + Send>,
}
#[derive(PartialEq, Eq, bincode::Encode, bincode::Decode, Clone, Debug)]
pub struct Sequence {
pub seq: Vec<u8>,
pub id: String,
pub location: usize,
pub end: usize,
}
impl Sequence {
pub fn make_uppercase(&mut self) {
self.seq.make_ascii_uppercase();
}
}
impl Iterator for Sequences {
type Item = Sequence;
fn next(&mut self) -> Option<Sequence> {
let bincode_config = bincode::config::standard().with_fixed_int_encoding();
let seq: Sequence =
match bincode::decode_from_std_read(&mut self.reader.as_mut(), bincode_config) {
Ok(x) => x,
Err(_) => {
println!("SeqStop");
return None;
}
};
Some(seq)
}
}
#[inline]
pub fn generic_open_file(filename: &str) -> (usize, bool, Box<dyn Read + Send>) {
let filesize = metadata(filename)
.unwrap_or_else(|_| panic!("{}", &format!("Unable to open file: {}", filename)))
.len();
let file = match File::open(filename) {
Err(why) => panic!("Couldn't open {}: {}", filename, why),
Ok(file) => file,
};
let file = BufReader::new(file);
let mut compressed: bool = false;
let fasta: Box<dyn Read + Send> = if filename.ends_with("gz") {
compressed = true;
Box::new(flate2::read::GzDecoder::new(file))
} else if filename.ends_with("snappy") || filename.ends_with("sz") || filename.ends_with("sfai")
{
compressed = true;
Box::new(snap::read::FrameDecoder::new(file))
} else {
Box::new(file)
};
(filesize as usize, compressed, fasta)
}
#[cfg(test)]
mod tests {}